1.5号io网络

僵尸进程和孤儿进程

僵尸进程

孤儿进程

守护进程

1.守护进程相当于一个服务,不依赖于终端而存在

2.守护进程随着系统的启动而启动,关闭而关闭

3.守护进程创建流程

1、创建一个孤儿进程

2、重设守护进程的会话id和组id

3、修改守护进程的操作目录为根目录

4、修改守护进程的创建文件的掩码为最大权限

5、将标准输入、标准输出、标准错误文件描述符重定向到一个文件中

6、该文件称为该守护进程的日志文件

4.相关API函数

#include <sys/types.h>

#include <unistd.h>

pid_t setsid(void);

功能:为当前进程创建一个新的会话,并将调用进程设置成会话组组长

参数:无

返回值:新会话的ID,失败返回-1并置位错误码

#include <unistd.h>

int chdir(const char *path);

功能:更改当前进程的操作目录

参数:要操作的起始目录

返回值:成功返回0,失败返回-1并置位错误码

#include <sys/types.h>

#include <sys/stat.h>

mode_t umask(mode_t mask);

功能:设置当前进程创建文件的掩码的值

参数:要创建的掩码值

返回值:成功之前的掩码的值,不会失败

多线程

多线程概念

1> 多线程也能实现多任务并发执行

2> 多线程:成为轻量版进程(LWP),是粒度更小的调度单元

3> 线程是执行任务的最小单位,进程是资源分配的最小单位

4> 一个进程,可以包含多个线程,但是至少要包含一个线程(主线程)

5> 线程几乎不占用资源,仅仅占用有关线程属性的一些资源,大概有8K左右

6> 同一个进程中的多个线程,共享进程的资源,可能会产生资源的抢占(竞态)

7> 由于线程体较小,任务调度线程时所需开销也较小,所以多任务编程是,大多选择多线程

8> 每个线程拥有自己唯一的一个线程号(tid)

9> 线程的调度原则:时间片轮询上下文切换

10> 关于线程相关函数,需要连接外部库进行操作,编译时需要加上:-pthread

线程创建 pthread_create

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

功能:在当前进程中,创建一个新的线程

参数1:线程号指针,传递一个存放线程号的变量

参数2:线程属性,一般为NULL,表示使用默认的线程属性

参数3:线程体函数,是一个函数指针,需要传递一个返回值为void*类型参数为void*类型的函数名 参数4:参数3的参数,表示创建线程向新线程中传递(返回)的内容

返回值:成功返回0,失败返回一个错误码(非内核提供的错误码)

编译时需要加上-pthread

多线程的资源分配问题

同一进程中的多个线程共享进程的资源

可以使用全局变量,完成不同线程间的消息通信

主线程向分支线程传递数据

传递单个数据

传递多个数据

创建结构体

线程号的获取:pthread_self

#include <pthread.h>

pthread_t pthread_self(void);

功能:获取当前线程的线程号

参数:无

返回值:当前线程的线程号,不会失败

线程退出函数:pthread_exit

#include <pthread.h>

void pthread_exit(void *retval);

功能:退出当前线程

参数:线程退出时的状态,一般填NULL

返回值:无

线程的回收函数:pthread_join/pthread_detach

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

功能:以阻塞的形式回收线程的资源

参数1:要回收的线程tid号

参数2:接收线程退出时的状态,一般填NULL

返回值:成功返回0,失败返回一个错误码

#include <pthread.h>

int pthread_detach(pthread_t thread);

功能:将线程设置成分离态,被设置成分离态的线程退出后,其资源由系统回收

向线程发送取消信号 pthread_cancel

#include <pthread.h>

int pthread_cancel(pthread_t thread);

功能:向一个指定线程中发送一个取消请求

参数:线程号

返回值:成功返回0,失败返回非0错误码

#include <pthread.h>

int pthread_setcancelstate(int state, int *oldstate);

功能:设置当前线程是否要接受其他线程的取消请求

参数1:状态 PTHREAD_CANCEL_ENABLE:可接受取消请求(默认) PTHREAD_CANCEL_DISABLE:不可接收取消请求

参数2:接受当前线程旧的状态,如果不想接受。填NULL即可

返回值:成功返回0,失败返回一个错误码

线程的同步互斥机制

引入目的

1.由于多个线程共用进程的资源,所有可以通过全局资源完成多个进程的之间消息的传递

2.临界资源:多个线程共同使用的全局资源称为临界资源

3.临界区:访问临界资源的代码段称为临界区

4.多个进程访问临界资源时,会产生相互抢占的现象,该线程称为竞态,为了防止竞态的产生,引入了同步互斥机制

5.互斥:同一时刻,只允许一个线程使用临界资源,其他线程处于等待状态,直到拥有临界资源的线程释放了临界资源的使用权,没有先后顺序

6.同步:多个线程有顺序的访问临界资源

互斥

1.互斥机制中引入了互斥锁

2.互斥锁的本质也是一个特殊的临界资源,当某个线程抢到该锁资源后,其他线程只能处于等待状态,直到该线程释放锁资源

3.对于互斥锁的操作分别为:创建互斥锁、获取锁资源、释放锁资源、销毁互斥锁

同步机制之无名信号量

1.同步:多个线程有顺序的执行

2.无名信号量:本质上也是一个临界资源,维护了一个value值,每个线程要执行时,先申请该value值,申请成功时,将value值减1,如果申请时,value值为0,则该线程在申请处阻塞,直到另一个线程将该无名信号量的value值增加到大于0.

3. 线程同步多用于生产者消费者模型:生生产者生产数据,消费者消费数据

作业

3.拷贝

4.ABC

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值