这是我写的程序
#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 :(得分:0)
5503
被返回到调用fork()
的父级,因为在父级中,fork()
返回其新创建的子级的PID,并且在子级中{{1}返回。因此,您需要对来自0
的返回值执行if
以测试您是否在父级或子级中,以便您可以仅在您想要的代码中运行后续代码,否则将运行在两者中。
至于你问题的第二部分,你需要在fork()
之前检查你是否在父母(或孩子,取决于你想要创建第二个孩子的人)(并且只等待 - 再次等待父项(fork
循环的第二次迭代);如果不这样做,父和子(从第一次在第一次迭代中调用时)将调用for
并且每个都创建另一个子项。这就是父母正在创建fork()
。