c - 当父母和孩子都执行 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() 后仍然处于挂起状态,但为它们定义的任何捕获函数都没有,所以我不确定是否可以在这里完成任何“信号魔术”。
解决方案
default
作为父进程运行的原程序被 ,子句执行的新程序替换switch
,并且(假设execvp()
成功)这意味着原程序不能等待它的子进程——原程序不再运行。
但是,替换程序有一个可以等待的子程序,但是替换程序不太可能知道该子程序的存在,直到它发现它获得了一个子程序的状态,而该子程序在调用其中一个时从未创建过函数族wait()
。这意味着任何分叉其他进程并随后等待死去的孩子的程序都应该容忍来自它没有创建的进程的尸体;它的前身程序可能已经创建了刚刚死掉的进程。
您可能需要更改流程树的组织。例如,原进程可以分叉两次,第二个子进程执行parentCommands
数组标识的命令,而原进程等待两个子进程都死掉。
或者,也许原始程序可以告诉替换孩子以某种方式存在。有很多方法可以做到这一点(参数、环境变量、IPC 机制……)。
推荐阅读
- java - 模拟器中未收到来自本地主机的 UDP 数据包
- python - 删除某些单词并组合表格
- reactjs - 当 prop 改变时 React 不会重新渲染
- python - 具有可变数量的str /相同类型参数的可调用的Python类型提示?
- php - 从 php 使用 cURL 时 JSON 中出现意外的令牌
- java - 原生 express adview 的 adSize 是多少?
- python - 如何在 Spacy 中为 OOV 术语指定词向量?
- html - 从自定义 CSS 迁移到 Bootstrap
- vb.net - 如何搜索文件并将其附加到电子邮件
- r - 数据框行元素的成对比较