我的测试代码是
#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);
}
Run Code Online (Sandbox Code Playgroud)
所以我有一个父母和4个孩子.当我杀死父母时,孩子们正在使用init作为父母.但如果我(与SIGSTOP)停止其中一个孩子然后杀死父母,孩子们也会被杀死.为什么会这样?
thk*_*ala 13
显然,如果进程组中的进程停止,则所有进程都会通过SIGHUP发出信号,然后在进程组组长终止时发出SIGCONT信号.SIGHUP的默认处理程序终止进程.这是预期的行为,如例如
http://www.win.tue.nl/~aeb/linux/lk/lk-10.html
从以上链接:
如果进程终止导致进程组变为孤立状态,并且某个成员被停止,则所有成员首先发送SIGHUP然后发送SIGCONT.
这个想法可能是流程组负责人的父级是一个工作控制shell.(在同一会话中但是不同的进程组.)只要此父级处于活动状态,它就可以处理进程组中成员的停止和启动.当它死亡时,可能没有人继续停止进程.因此,这些已停止的进程被发送SIGHUP,因此它们会死掉,除非它们捕获或忽略它,然后SIGCONT继续它们.
编辑:
顺便说一句,strace是一个很好的工具,可以找到这样的东西.如果您将strace附加到其中一个子进程,您将看到只有当父进程(即进程组负责人)死亡时才停止其中一个进程才会传递SIGHUP.
如果希望子进程能够生存,则需要使用例如sigaction(2)更改SIGHUP的处理程序.