进程等待必要性
1.子进程退出,父进程如果不知道子进程退出,就可能造成“僵尸进程”的问题,这就是内存泄露。
2.一旦子进程变成了僵尸进程,KILL - 9也无能为力,没有办法去杀死一个已经死去的进程
3.子进程是父进程为了完成任务而生成的,派发给子进程的任务是否完成了,完成的怎么样,父进程都不知道。父进程需要知道该情况。
4.父进程通过等待的方式,回收子进程的资源,获取子进程退出信息
进程等待方法
API:pid_t wait(int *status)
wait一直阻塞,直到有一个子进程死亡,称为僵尸进程,回收掉僵尸。
返回值:成功:wait返回子进程pid
失败 返回 -1
status:得到子进程的死亡信息
代码如下
从代码中看出,如果子进程是正常退出下, 状态码为10。如果退出的状态码不为10,则子进程是被其他信号杀死的。
通过以下指令查看在运行的进程:
ps -ef | grep wait | grep -v grep
可以看到如果是正常退出,退出码为10。
使用wait() 函数,父进程获取子进程的退出状态。回收了子进程的资源及其知道了分配给子进程的任务是否完成了。
pid_t waitpid(pid_t pid, int *status, int options);
pid>0 等待指定子进程
pid=0 等待本进程组的任何一个子进程死亡
pid = -1 等待本进程的任何一个子进程死亡
pid <-1 等待|pid|进程组的任何一个子进程死亡
options: 0阻塞
WNOHANG 非阻塞
如果有子进程处于僵尸状态,回收,如果没有,就返回0
我们还可以使用waitpid进行等待: