如果多个子进程同时终止,wait()会发生什么?

时间:2013-12-02 15:42:03

标签: linux process wait

假设我创建了一个包含多个子进程的进程,并在主进程中调用wait()。如果一个孩子终止,则返回其pid。但是,如果几个子进程同时终止会发生什么?呼叫应该返回其中一个,第二个呼叫应该返回另一个,对吧?是否存在他们将返回的特定顺序(可能优先考虑具有较低pid的孩子)?

1 个答案:

答案 0 :(得分:2)

SUSv4明确地未指定由一个或多个wait调用获得的子进程的顺序(如果有的话)。由于不同的Linux内核版本的表现不同,因此也没有您可以依赖的“accidential”订单。 (资料来源:M. Kerrisk,TLPI,26.1.1,第542页)。

<小时/> 有点相关的琐事:
您可能想知道为什么可以可靠地等待几个并发终止的子进程 at all 。如果您考虑信号如何工作,您可能倾向于认为丢失儿童终止信号是完全可能的。信号,一个众所周知的事实,没有排队(实时信号除外,但SIGCHLD不是一个!)。这意味着如果你严格遵守书中的字母,那么显然有几个孩子终止可能会导致一些孩子的终止信号丢失!
您只能同时拨打wait一次,这样您最多可以在生成时同步消耗一个信号,并在下次调用wait之前使第二个信号等待处理。似乎无法解释同时生成的任何其他信号。

幸运的是,事实并非如此。等待儿童过程显然工作正常。总是,100%。但为什么呢?

原因很简单,内核是“作弊”。如果在wait中阻止子进程退出,则毫无疑问发生了什么。信号立即传递,状态信息被填写,父母解除阻塞,子进程变为* poof *。
另一方面,如果孩子正在退出且父母不在wait电话中(或者如果父母 wait电话中收割另一个孩子),系统将现有过程转换为“僵尸” 现在,当父进程执行wait并且存在任何僵尸进程时,它不会阻止等待生成信号(如果所有子进程已经退出,则可能永远不会发生!)。相反,它只会收获一个僵尸,假装信号刚刚交付。