自学内容网 自学内容网

【Linux】进程等待

目录

为什么要进程等待?

进程等待是什么?

怎么实现进程等待?

wait

等待单个子进程

等待多个子进程

waitpid

第一个参数

第二个参数

两个宏

第三个参数


为什么要进程等待?

第一:僵尸进程无法被杀死,需要进程等待来接收,防止内存泄漏。

第二:父进程可以通过进程等待来获取子进程的任务完成情况。

进程等待是什么?

通过系统调用wait/waitpid来对子进程进行状态检查和回收的功能。

怎么实现进程等待?

父进程通过调用wait/waitpid进程僵尸进程的回收。

wait

等待单个子进程

返回要等待的子进程的pid

等待多个子进程

wait是等待任意一个子进程退出。

多个子进程的情况,有多少个就等多少次。

如果子进程就是不退出,那么父进程会一直阻塞等待。

waitpid

第一个参数

第一个参数:指定等待某个进程,-1代表任意一个。

第二个参数

第二个参数:输出型参数,int被当作几部分使用。

因为父进程关心子进程的信息挺多,所以要分几部分,比如是否异常退出,结果是否正确。

最低的八位代表进程是否异常,其中的低七位表示收到的终止信号。次低八位表示退出码。

父进程要拿子进程的数据为什么必须要用系统调用?

因为进程具有独立性。子进程修改的数据父进程看不到。

分别从status中取出信号和退出码。

子进程退出时会把退出信息比如退出码,终止信号记录在自己的PCB上,waitpid检测到你是Z状态就会把这些信息拿到给status,所以waitpid的本质是获取该进程的PCB其中的某些数据,然后把Z状态改为X。

等待失败返回-1,什么时候会等待失败?

等待的进程不是你的子进程就会失败。

两个宏

第三个参数

options:设置等待的方式。

0表示阻塞等待,子进程没结束父进程就一直等待,一直在子进程PCB等待队列中,等着子进程PCB的退出信息。

非阻塞轮询,非阻塞等待的选项是WNOHANG,间隔一段时间询问一次,其他时间做自己的事情。返回值=0就是子进程还没退出,等下一次再询问。

返回值等于0时,父进程可以做自己的事情。父进程在这里做的任务必须轻量级,复杂度不高的。

通过进程等待可以保证父进程是多个进程中最后一个退出的进程。


原文地址:https://blog.csdn.net/m0_71164215/article/details/143849412

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!