场景:我们有一个 linux 守护进程,称之为 Alpha。 Alpha forks/execs 一个子进程,Bravo。 Bravo 然后生成几个子进程,称它们为 Charlie 和 Delta。
Alpha | \-Bravo | \-Charlie | \-Delta
Bravo 死了。 Alpha 安装了一个 sig 子处理程序,它会触发。
我如何从 Alpha 找到 Bravo 的所有 child (Charlie 和 Delta)以便我也可以杀死他们?
我观察到,一旦 Bravo 被杀死,Charlie 和 Delta 就会成为 init (pid=1) 的 child 。我要么需要能够 1) 在重新分配 Bravo 的 child 之前检查进程树,要么 2) 以某种方式确保 Bravo 的 child 由 Alpha 继承。如果是这样的话,我可以在我(Alpha)自己的 child 中找出谁是谁。
最佳答案
您可以为此使用进程组。当 Bravo
启动时,在它调用 execve()
之前,使用 setpgid(0, 0);
使其成为进程组领导。然后它的子进程将继承这个进程组(它的 PGID 等于 Bravo
的 PID,因此为 Alpha
所知)。
当Bravo
退出时,它的 child 会被init
继承,但是他们的PGID不会改变。 Alpha
然后可以使用 kill()
一次性向它们发出信号,提供 PGID 的负值作为第一个参数。例如。在 Alpha
中,您可能会执行以下操作:
exited_child = wait(&status);
if (exited_child > 0)
kill(-exited_child, SIGTERM);
关于Linux - 找到一个垂死进程的所有 child (我自己的孙子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833026/