2016-08-29 59 views
0

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

#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?提前致谢。

+0

你了解'fork'的操作吗? –

+0

这个问题与'C++'无关 – alexeykuzmin0

+0

@OliverCharlesworth是的,我做 –

回答

0

5503被返回到调用fork()父母,因为在父母,fork()返回PID的它是新创建的孩子,在孩子,则返回0。因此,您需要对fork()的返回值if进行测试,以测试您是否在父代或子代中,以便您可以仅在所需的代码中运行后续代码,否则它将在两者中运行。

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

+0

这些支票故意不存在。我意识到我的错误。我感到困惑,忘记跟踪每个分支的原始父进程。无论如何,感谢您的帮助。 –