【Linux】进程等待
目录
为什么要进程等待?
第一:僵尸进程无法被杀死,需要进程等待来接收,防止内存泄漏。
第二:父进程可以通过进程等待来获取子进程的任务完成情况。
进程等待是什么?
通过系统调用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)!