假设我创建了一个包含多个子进程的进程,并在主进程中调用wait()
。如果一个孩子终止,则返回其pid
。但是,如果几个子进程同时终止会发生什么?呼叫应该返回其中一个,第二个呼叫应该返回另一个,对吧?是否存在他们将返回的特定顺序(可能优先考虑具有较低pid的孩子)?
答案 0 :(得分:2)
否强>
SUSv4明确地未指定由一个或多个wait
调用获得的子进程的顺序(如果有的话)。由于不同的Linux内核版本的表现不同,因此也没有您可以依赖的“accidential”订单。 (资料来源:M. Kerrisk,TLPI,26.1.1,第542页)。
<小时/> 有点相关的琐事:
SIGCHLD
不是一个!)。这意味着如果你严格遵守书中的字母,那么显然有几个孩子终止可能会导致一些孩子的终止信号丢失!wait
一次,这样您最多可以在生成时同步消耗一个信号,并在下次调用wait
之前使第二个信号等待处理。似乎无法解释同时生成的任何其他信号。幸运的是,事实并非如此。等待儿童过程显然工作正常。总是,100%。但为什么呢?
原因很简单,内核是“作弊”。如果在wait
中阻止子进程退出,则毫无疑问发生了什么。信号立即传递,状态信息被填写,父母解除阻塞,子进程变为* poof *。
另一方面,如果孩子正在退出且父母不在wait
电话中(或者如果父母 在wait
电话中收割另一个孩子),系统将现有过程转换为“僵尸”
现在,当父进程执行wait
并且存在任何僵尸进程时,它不会阻止等待生成信号(如果所有子进程已经退出,则可能永远不会发生!)。相反,它只会收获一个僵尸,假装信号刚刚交付。