场景:我们有一个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继承。如果是这样的话,我可以理清谁是我(阿尔法)自己的孩子中的谁。
答案 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);