进程等待..

进程等待:

1.是什么?

通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能!
在这里插入图片描述

2.为什么?

僵尸进程无法被杀死,需要通过进程等待来杀掉它,进而解决内存泄漏问题—必须解决的
我们要通过进程等待,获得子进程的退出情况—知道我布置给子进程的任务,它完成的怎么样了—要么关心,也可能不关心—可选的

3.怎么办?

代码:父进程通过调用wait/waitpid进行僵尸进程的回收问题!

1.等待单个进程

在这里插入图片描述

2.等待多个进程

wait等待任意一个进程,现在有多个子进程需要通过循环+wait

wait返回值为等待成功的子进程pid,如果小于0说明等待失败了
在这里插入图片描述

如果子进程不退出,父进程默认在wait的时候,调用这个系统调用的时候,也就不返回,默认叫做阻塞状态!
这也证明了之前我们进程状态谈的,一个进程不一定只等待硬件还可能等待其他进程

至此僵尸问题造成的内存泄露问题我们就解决了,我们解决如果想要关心子进程返回结果的问题
wait是waitpid的一个子集
如果waitpid pid是-1,则是等待任意一个子进程,与wait等价
如果pid>0,则等待指定pid的子进程
在这里插入图片描述
还是这个单个子进程代码,waitpid第二个参数是传入一个Int变量,并且这个int是被分为几部分使用的,它一共有32位,这个status作为输出型参数就能返回子进程退出情况(是否异常+退出码),我用waitpid等待,再将子进程退出exit(1)退出码设为1,打印出这个status看一看(还没有解构status,就先看看)
在这里插入图片描述
在这里插入图片描述
最后发现结果是256
在这里插入图片描述

解构status

我们只关注32位中低16位,低7位是是否异常,次低8位表示退出码
在这里插入图片描述
信号从1开始到64,所以只要低7位全为0则没收到过信号也就无异常
在这里插入图片描述
验证一下status的构成

1、位运算提取

在这里插入图片描述

2、宏

在这里插入图片描述
在这里插入图片描述

问题:

父进程要拿子进程的状态数据,任意数据,为什么必须要用wait等系统调用呢?
如果用一个全局变量status,子进程退出时将退出码赋值给这个全局变量,可不可以呢?

进程具有独立性,子进程把全局变量改了但是父进程看不到,只能用wait让操作系统帮我们拿

进程等待原理:

子进程执行完毕时,允许把代码和数据直接释放掉,把sigcode和exitcode放到tast_struct内核数据结构对象当中(图中黑色变量),父进程通过系统调用waitpid以操作系统的身份读取子进程PCB结构,waitpid还检查子进程的状态是否是僵尸状态?如果是,此时直接读取exitcode和sigcode后经过位运算返回给父进程status
在这里插入图片描述
所以waitpid的本质是获取内核数据结构并且将进程状态由Z状态改为X (dead)状态,这就叫进程终止。

那进程等待什么时候失败呢?
你能等待的只能是你自己的子进程,如果waitpid(id+4,null,0),id+4是我瞎写的一个进程号,那么此时等待失败

设置等待方式
1、阻塞式等待

在这里插入图片描述
if options == 0 时
如果等待是子进程退了就直接返回了
如果子进程都没退呢,就把父进程状态由R状态改为S状态,再链入到子进程Pcb等待队列,等待子进程完成时,再唤醒父进程
在这里插入图片描述

2、非阻塞轮询

options 设置为WNOHONG这个宏时,父进程就会一直询问子进程是否完成,当子进程还没完成时waitpid就会返回0,此时父进程就可以做一些自己的事情!
在这里插入图片描述

父进程自己的事情是什么?能不能写个demo看看
1、单个子进程场景

2、多个进程场景
思路:
1、设定一个宏,让父子进程都知道你创建了多少个子进程,然后每次waitipid 如果等待成功就减减计数器,减到0就break;
2、waitpid如果还有子进程需要等待那就会一直返回0,那就一直回收,如果有一次等待失败了,此时等待完成了。

如果父进程自己的事情很耗时费力行不行?是父进程等待的时候做自己的事情重要还是子进程的事情重要
肯定是子进程的事情更重要,父进程的任务一定要轻量化。

进程等待还有一个作用就是保证了多个进程不管谁先谁后,反正最后一个结束的对所有子进程回收的肯定是父进程

https://gitee.com/ljh0617/linux_test/blob/a4d6f429bf93414f6c20d42e3bf6e78e23d99b6b/10-26/testWait.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值