我的测试代码是
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
int c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
while(1);
}
所以我有一个父母和4个孩子。当我杀死父母时,孩子们正在使用init作为父母。但如果我(与SIGSTOP)停止其中一个孩子然后杀死父母,孩子们也会被杀死。为什么会这样?
答案 0 :(得分:13)
显然,如果进程组中的进程停止,则所有进程都会通过SIGHUP发出信号,然后在进程组组长终止时发出SIGCONT信号。 SIGHUP的默认处理程序终止进程。这是预期的行为,如例如
中所述http://www.win.tue.nl/~aeb/linux/lk/lk-10.html
从以上链接:
如果过程终止导致a 进程组成为孤儿,并且 一些成员被阻止,然后都是 首先发送SIGHUP然后发送SIGCONT。
这个想法可能是父母的 流程组负责人是一份工作 控制壳。 (在同一场会议上 但是一个不同的过程组 只要这位父母还活着,它就可以 处理停止和启动 流程组中的成员。当它 死了,可能没有人可以继续 停止进程。因此,这些 停止进程发送SIGHUP,所以 他们死了,除非他们抓住或 忽略它,然后SIGCONT来 继续他们。
编辑:
顺便说一下,strace是一个很好的工具,可以帮助你找到这样的东西。如果您将strace附加到其中一个子进程,您将看到只有在父进程(即进程组负责人)死亡时才停止其中一个进程才会传递SIGHUP。您需要使用例如更改SIGHUP的处理程序sigaction(2)如果你想让子进程生存。
答案 1 :(得分:0)
子进程与父进程属于同一进程组,因此与其父进程一起被终止。
提示:不要使用while(1);
暂停进程。让它sleep
无限期。