因此,当孩子去世时,父母会得到SIGCHLD
,但如果父母在执行 wait() 之前死亡,则孩子会重新成为init
. 此时的孩子是zombie
ie <defunct>
。
接下来发生什么?
init
对那个孩子做 wait() 吗?如果是,它什么时候做?关于时限的任何保证?
因此,当孩子去世时,父母会得到SIGCHLD
,但如果父母在执行 wait() 之前死亡,则孩子会重新成为init
. 此时的孩子是zombie
ie <defunct>
。
接下来发生什么?
init
对那个孩子做 wait() 吗?如果是,它什么时候做?关于时限的任何保证?
是的,init
将立即收获所有的孩子。如果您创建一个忽略SIGCHLD
并累积许多僵尸的进程,您可以通过您描述的机制杀死该父级来摆脱它们。
init
这里是多用户模式下 的while主循环供参考。requested_transition
通过信号设置(例如读取更新init
的经典):kill -1 1
inittab
while (!requested_transition)
if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
collect_child(pid);
(collect_child
处理 init 对进程有特殊兴趣的情况,例如现在需要一个新的登录 shell getty
)