一、wait() 介绍
有时候我们需要让一个进程等待另一个进程(最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程),就需要使用到系统调用函数—— wait() 。对 wait 的调用会阻塞调用进程,直到它的一个子进程退出或接收到信号。而子进程终止后,父进程将继续执行 wait() 系统调用之后的指令。
简单来说,父进程执行 wait 函数之后,会被阻塞在此处。如果子进程状态发生变化,wait 函数会立即返回结果;否则 wait 函数会一直阻塞父进程,直到子进程状态发生变化。
wait():以阻塞的方式等待子进程退出,防止僵尸进程的产生。
- 当父进程忘了使用 wait() 函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程
- 如果父进程有多个子进程,只要有一个子进程终止,父进程就可以结束等待状态
二、wait 函数原型
int wait(int *status)
- 参数 status 用来保存被收集进程退出时的一些状态,是一个指向 int 类型的指针
① 如果我们对这个子进程是如何死掉并不在意,只想把这个僵尸进程消灭掉,就可以设定这个参数为 NULL :
pid = wait(NULL);
如果成功,wait 会返回被收集的子进程的进程ID。如果调用进程没有子进程,调用就会失败,此时 wait 返回 -1,同时 errno 被置为 ECHILD 。
② 如果参数 status 的值不是NULL,wait 就会把子进程退出时的状态取出并存入 status 中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。
三、wait 返回值
在有多个子程序的情况下,如果只终止了一个子进程,则返回该终止的子进程ID;如果终止了多个子进程,则 wait() 将获取任意的已终止子进程并返回该子进程的ID。
返回值 | 含义 |
---|---|
-1 | 调用出错,此时出错信息在 errno 中 |
0 | waitpid 的 options 设置了 WNOHANG,且调用中没有子进程退出 |
>0 | 返回结束子进程的 PID |
四、总结
wait() 会暂时停止当前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait() 时子进程已经结束,则 wait() 会立即返回该子进程的结束状态值。子进程的结束状态值由参数 status 返回,子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL 。