使父进程等待其子进程的正确方法是什么?

时间:2016-08-29 16:19:32

标签: c linux unix process

这是我写的程序

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<iostream>
#include<wait.h>
int main(void){
    std::cout << "My process " << getpid() << std::endl;
    int i;
    for(i=0;i<2;i++){
        int j = fork();
        wait(NULL);

        std::cout << "Process id :" << getpid() <<" and parent:"<< getppid()<< " and value returned is " << j <<std::endl;
    }
    return 0;
}

这是我得到的输出:

My process 5501
Process id :5502 and parent:5501 and value returned is 0
Process id :5503 and parent:5502 and value returned is 0
Process id :5502 and parent:5501 and value returned is 5503
Process id :5501 and parent:2828 and value returned is 5502
Process id :5504 and parent:5501 and value returned is 0
Process id :5501 and parent:2828 and value returned is 5504

有人可以向我解释输出吗?该计划的目的是以DFS方式“访问”流程。但是,我不明白第三行中返回的值是5503以及为什么,即使我只运行两次循环,也会创建5504?提前致谢。

1 个答案:

答案 0 :(得分:0)

5503被返回到调用fork()的父级,因为在父级中,fork()返回其新创建的子级的PID,并且在子级中{{1}返回。因此,您需要对来自0的返回值执行if以测试您是否在父级或子级中,以便您可以仅在您想要的代码中运行后续代码,否则将运行在两者中。

至于你问题的第二部分,你需要在fork()之前检查你是否在父母(或孩子,取决于你想要创建第二个孩子的人)(并且只等待 - 再次等待父项(fork循环的第二次迭代);如果不这样做,父和子(从第一次在第一次迭代中调用时)将调用for并且每个都创建另一个子项。这就是父母正在创建fork()

的原因