1

因此,当孩子去世时,父母会得到SIGCHLD,但如果父母在执行 wait() 之前死亡,则孩子会重新成为init. 此时的孩子是zombieie <defunct>

接下来发生什么?

init对那个孩子做 wait() 吗?如果是,它什么时候做?关于时限的任何保证?

4

1 回答 1

2

是的,init将立即收获所有的孩子。如果您创建一个忽略SIGCHLD并累积许多僵尸的进程,您可以通过您描述的机制杀死该父级来摆脱它们。

init这里是多用户模式下 的while主循环供参考。requested_transition通过信号设置(例如读取更新init的经典):kill -1 1inittab

    while (!requested_transition)
            if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
                    collect_child(pid);

collect_child处理 init 对进程有特殊兴趣的情况,例如现在需要一个新的登录 shell getty

于 2011-12-13T22:47:48.293 回答