gpt4 book ai didi

c - SIGKILL 到父终止时的子进程树

转载 作者:行者123 更新时间:2023-12-04 07:18:52 27 4
gpt4 key购买 nike

我有一个守护程序应用程序,它启动几个 3rd 方可执行文件(所有的都是封闭源代码和不可修改的)。
我想让所有子进程在父进程因任何原因退出时自动终止( 包括崩溃 )。
目前,我正在使用 prctl要实现这一点(另见 this 问题):

int ret = fork();
if (ret == 0) {
//Setup other stuff
prctl (PR_SET_PDEATHSIG, SIGKILL);

if (execve( "childexecutable" ) < 0) { /*signal error*/}
}
但是,如果“childexecutable”也 fork 并产生“grandchildren”,那么当我的进程退出时,“grandchildren”不会被杀死。
也许我可以创建一个中间过程作为 subreaper ,然后当我的进程终止时会杀死“someexecutable”,但是然后等待 SIGCHLD 并继续杀死子进程直到没有剩余,但它似乎非常脆弱。
有更好的解决方案吗?

最佳答案

在这种情况下,创建子收割者没有用,您的孙子会被 init 重新养育并收割。反正。
但是,您可以做的是:

  • 启动父进程和 fork马上就生了 child 。
  • 父级将简单地 wait为了 child 。
  • child 将执行您实际程序的所有工作,包括通过 fork 生成任何其他 child 。 + execve .
  • 在 child 出于任何原因(包括死亡信号,例如崩溃)退出时, parent 可以发出 kill(0, SIGKILL)killpg(getpgid(0), SIGKILL)杀死其进程组中的所有进程。发出 SIGINT/SIGTERM之前 SIGKILL根据您要运行的子进程,这可能是一个更好的主意,因为它们可以处理此类信号并在退出之前对使用的资源(包括子进程)进行优雅的清理。

  • 假设在运行时没有任何子进程或孙进程更改他们的进程组,这将在退出程序时杀死整个进程树。您也可以保留 PR_SET_PDEATHSIG在任何之前 execve使这更加健壮。再次取决于您要运行的进程 PR_SET_PDEATHSIGSIGINT/ SIGTERM可能比 SIGKILL 更有意义.
    您可以发出 setpgid(getpid(), 0)在执行上述任何操作之前为您的程序创建一个新的进程组并避免在发出 kill(0, SIGKILL) 时杀死任何父进程.
    “父”进程的逻辑应该很简单,只是一个 fork + wait在循环中 + kill在由 wait 返回的正确条件下.当然,如果这个过程也崩溃了,那么所有的赌注都没有了,所以在编写简单可靠的代码时要小心。

    关于c - SIGKILL 到父终止时的子进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68625148/

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