如果其中一个使用SIGSTOP停止,则父进程在杀死父进程时会死亡

时间:2010-12-04 17:45:18

标签: c linux unix

我的测试代码是

#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)停止其中一个孩子然后杀死父母,孩子们也会被杀死。为什么会这样?

2 个答案:

答案 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无限期。