我发现了一个有趣的问题(请注意,我刚刚开始研究这个问题,所以我是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()之后,待处理的信号仍然保持待处理状态,但是没有为它们定义的捕获函数,因此我不确定是否可以在此处完成任何“信号魔术”。
作为父进程运行的原始程序被替换为的default
子句执行的新程序switch
,并且(假设execvp()
成功)意味着原始程序无法等待其子进程-原始程序不再运行。
但是,替换程序有一个可以等待的孩子,但是替换程序不太可能意识到该孩子的存在,直到它发现它调用了其中一个时从未获得过的孩子的状态。该wait()
家庭的功能。这意味着任何派生其他进程并随后等待死孩子的程序都应容忍尸体不受其未创建的进程的影响;它的前一个程序可能创建了刚刚终止的进程。
您可能需要更改流程树的组织。例如,原始进程可能会分叉两次,第二个子进程将执行由parentCommands
数组标识的命令,而原始进程将等待两个子进程都死亡。
或者,也许原始程序可以以某种方式告诉替换项孩子存在。有很多方法可以做到这一点(参数,环境变量,IPC机制等等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句