我可以阻止fork()返回shell吗?

时间:2012-03-30 23:02:26

标签: c makefile fork

我有一个看起来像这样的Makefile:

sometarget: 
    command_one    # calls fork()
    command_two

这是我在make sometarget时遇到的问题:

  1. command_one启动并最终调用fork()

  2. 子进程exec提前完成并在make的所有处理完成之前将控制权返回command_one

  3. command_two然后在父完成之前执行,导致序列失败(因为它完全取决于command_one完成)。

  4. 我可以更改command_one(fork()和exec()必须保留),如果可能的话我宁愿不更改Makefile。有没有办法阻止子进程返回(在Linux上)?我认为答案是否定的,但我以前错了......

1 个答案:

答案 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);
}