首页 > 解决方案 > 当父母和孩子都执行 exec() 时等待孩子

问题描述

我发现了这个有趣的问题(注意我刚开始研究这个,所以我是 UNIX 系统调用、信号等方面的新手),到目前为止我无法解决:

假设我们在 main.c 上有以下代码:

switch (fork()) {
    case -1:
        printf("error!");
        break;
    case 0: // child process
        execvp(childCommands[0], childCommands);
        break;
    default: // parent process
        execvp(parentCommands[0], parentCommands);
        break;
}

以任何方式,原始父进程是否有可能对其子进程执行 wait() ?

据我所知,挂起的信号在执行 exec() 后仍然处于挂起状态,但为它们定义的任何捕获函数都没有,所以我不确定是否可以在这里完成任何“信号魔术”。

标签: cunixexec

解决方案


default作为父进程运行的原程序被 ,子句执行的新程序替换switch,并且(假设execvp()成功)这意味着原程序不能等待它的子进程——原程序不再运行。

但是,替换程序有一个可以等待的子程序,但是替换程序不太可能知道该子程序的存在,直到它发现它获得了一个子程序的状态,而该子程序在调用其中一个时从未创建过函数族wait()。这意味着任何分叉其他进程并随后等待死去的孩子的程序都应该容忍来自它没有创建的进程的尸体;它的前身程序可能已经创建了刚刚死掉的进程。

您可能需要更改流程树的组织。例如,原进程可以分叉两次,第二个子进程执行parentCommands数组标识的命令,而原进程等待两个子进程都死掉。

或者,也许原始程序可以告诉替换孩子以某种方式存在。有很多方法可以做到这一点(参数、环境变量、IPC 机制……)。


推荐阅读