僵尸进程和孤儿进程
僵尸进程
孤儿进程
守护进程
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