通过系统调用wait/waitpid,来对子进程进行状态检验与回收的工作。


只要没有子进程退出,父进程就会在wait()处一直等待,不返回,默认为阻塞等待状态
阻塞状态:scanf是等待硬件资源
wait不返回时相当于等待软件资源



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





要获取的信息有好几部分,因此status的32位被分为几部分使用。

[0,6]位 共有2^6 == 64个信号 表示异常终止,本质是进程收到了某个信号 7表示core dump
例如:段错误,除0错误。


[8,15]表示退出状态,即exit对应的退出码

通过位运算&和>>得到退出信号和退出码

子进程退出后释放代码和数据,但保留task_struct,用来给上层返回退出信息



WIFEXITED--> Wait if exited 查看子进程是否正常退出
WEXITSTATUS--> 子进程退出状态 即退出码

options == 0 阻塞等待方式
options == WNOHANG(wait no....)
非阻塞轮询:非阻塞+循环
查询不成功就返回,然后继续循环查询直到成功。
两次查询之间的时间可以做自己的事情。


1、wait的主要任务是等待子进程,父进程此时额外做的一般是轻量级的工作,要及时返回
2、稍晚一点回收子进程,或者将多个子进程统一回收也是可接受的


