Kva*_*ass 2 c unix fork process wait
我使用以下代码等待所有子进程完成:
int pid;
do {
pid = wait(NULL);
} while (pid != -1);
Run Code Online (Sandbox Code Playgroud)
然而,如果我的孙子在父进程死亡时运行,它似乎不起作用。举例来说,假设我有一个进程 Alpha,它分叉了一个子 Beta,而 Beta 又分叉了一个子 Gamma。然后贝塔死了,而伽玛继续奔跑。我希望能够让 Alpha 等待 Gamma 完成。问题是我无法存储 Gamma 的进程 id - Alpha 需要能够等待所有子进程、孙子进程、曾孙进程等完成,而不知道他们各自的 pid。这可以做到吗(如果可以的话怎么做)?
小智 5
优雅地等待孙子,其实有一种方法。从Linux 3.4开始,有一个新的API叫做PR_SET_CHILD_SUBREAPER
,它可以让父进程变成类似init
. 父进程将重新设置其后代中所有孤儿进程的父进程。
以下内容摘自 PRCTL(2) 的手册页:
子收割者为其后代进程履行 init(1) 的角色。当一个进程成为孤立进程(即,它的直接父进程终止)时,该进程将被重新指定为最近的仍然存在的祖先子收割者。随后,在孤立进程中调用 getppid() 现在将返回子收割器进程的 PID,并且当孤儿进程终止时,子收割器进程将接收 SIGCHLD 信号,并且能够在该进程上 wait(2)发现其终止状态。