gpt4 book ai didi

Linux - 找到一个垂死进程的所有 child (我自己的孙子)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:34 30 4
gpt4 key购买 nike

场景:我们有一个 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com