目录
什么是进程等待
通过wait/waitpid的方式,让父进程对子进程进行资源回收的等待过程
为什么要进行进程等待
1.解决子进程僵尸问题带来的内存泄漏问题(目前必须)
2.父进程为什么要创建子进程?要让子进程完成任务
子进程将任务完成的如何,父进程要不要知道?要知道
这就需要通过进程等待的方式获取子进程退出的信息(两个数字,信号和退出码)(不是必须,但是系统需要提供这样的基础功能)
如何进行进程等待
wait函数
wait函数是系统调用函数
返回值:等待成功,返回被等待进程的pid
等待失败,返回-1
参数:输出型参数,可以获取子进程的退出状态,如不需要,可以设置成NULL
a.进程等待可以回收子进程僵尸状态
b.如果子进程没有退出,父进程必须在wait上进行阻塞等待,直到子进程僵尸,wait自动回收,返回
一般而言,谁先运行不知道,但最后一般都是父进程最后结束
父进程代码中after wait是在子进程运行结束后,wait等待后才执行
waitpid函数
第一个参数:pid
指定pid,等待直到pid的进程
-1 任意进程,与wait相同
第二个参数status
可以获取子进程的退出信息
输出型参数
如果给status传的是NULL,表示则不需要获取子进程的退出信息
如果给statue传得是非NULL,表示需要获取子进程的退出信息
status是一个整型变量,32bit,我们只需要研究低16位
exit code (退出码) (status>>8)& 0xFF
exit sign(信号) status& 0x7F
系统中定义了两个宏
WEXITSTATUS(status) 退出码
WIFEXITED(status) 若未正常终止子进程返回的状态,则为真
验证
子进程退出码是10,而status接收到的值是2560
1.当一个进程异常了(收到信号),exit code没有意义
2.有没有收到信号怎么判断? exit sign ==0
3.手动杀死进程
父进程如何得知子进程的退出信息呢?wait?waitpid??
我们为什么不用全局变量来获取子进程的退出信息?而用系统调用
进程具有独立性,父进程无法直接获取子进程的退出信息
例如:
我们等待多个进程
第三个参数options
0:阻塞等待
宏:WNOHANG 等待的时候,以非阻塞的方式进行等待
rid>0:等待成功
rid==0:等待是成功的,但是对方还没有退出
rid<0:等待失败
非阻塞等待要与轮询配合使用
父进程在while(1)里面进行rid判断是否退出,或者执行其他任务