我有一个看起来像这样的Makefile:
sometarget:
command_one # calls fork()
command_two
这是我在make sometarget
时遇到的问题:
command_one
启动并最终调用fork()
。
子进程exec
提前完成并在make
的所有处理完成之前将控制权返回command_one
。
command_two
然后在父完成之前执行,导致序列失败(因为它完全取决于command_one
完成)。
我可以更改command_one
(fork()和exec()必须保留),如果可能的话我宁愿不更改Makefile。有没有办法阻止子进程返回(在Linux上)?我认为答案是否定的,但我以前错了......
答案 0 :(得分:3)
听起来你的command_one
看起来像这个伪代码:
main() {
pid_t child = fork(); /* ignore error for sake of example */
if (child) {
/* some work in the parent */
exit;
} else {
/* some work in the child */
}
exit;
}
如果您在父母的 waitpid(2)
之前插入wait(2)
或exit
(或任何家庭成员),则会确保这两个孩子父项在make(1)
移动到下一个命令之前完成。看起来更像这样:
main() {
pid_t child = fork(); /* ignore error for sake of example */
if (child) {
/* some work in the parent */
exit;
} else {
/* some work in the child */
}
waitpid(child, &status, 0); /* NEW LINE */
exit(&status);
}