Linux - 找到一个垂死过程中的所有孩子(我自己的孙子)

时间:2011-07-26 16:01:12

标签: linux daemon

场景:我们有一个linux守护进程,称之为Alpha。 Alpha分叉/执行一个子进程,Bravo。然后,Bravo产生了几个子进程,称之为Charlie和Delta。

Alpha
  |
   \-Bravo
     |
      \-Charlie
     |
      \-Delta

Bravo死了。 Alpha安装了一个sig子处理程序,它会触发。

我如何从阿尔法找到所有布拉沃(查理和三角洲)的孩子,以便我也可以杀死他们?

我观察到的是,一旦Bravo被杀,Charlie和Delta成为init的孩子(pid = 1)。我要么必须能够1)在重新分配Bravo的孩子之前检查过程树,或者2)确保Bravo的孩子被Alpha继承。如果是这样的话,我可以理清谁是我(阿尔法)自己的孩子中的谁。

1 个答案:

答案 0 :(得分:1)

您可以为此使用进程组。启动Bravo后,在调用setpgid(0, 0);之前,让其成为使用execve()的流程组负责人。然后它的子进程将继承这个进程组(其PGID等于Bravo的PID,因此Alpha已知。)

Bravo退出时,其子项将由init继承,但其PGID不会更改。然后,Alpha可以使用kill()一次性发出信号,将PGID的负数作为第一个参数。例如。在Alpha中,您可能会执行以下操作:

exited_child = wait(&status);
if (exited_child > 0)
     kill(-exited_child, SIGTERM);