这是我写的程序
#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是被创建的?提前谢谢。
最佳答案
5503
被返回到名为fork()
的父级,因为在父级中,fork()
返回其新创建的子级的PID,在子级中,0
被返回。因此,您需要对if
的返回值执行fork()
来测试您是在父级还是子级中,以便只能在所需的代码中运行后续代码,否则将在这两个代码中运行。
至于问题的第二部分,您需要在再次(循环的第二次迭代)之前检查您是否在父级(或子级,具体取决于您要创建第二个子级的人)中;如果不在,则需要检查您是否在父级(或子级,具体取决于您要创建第二个子级的人),父项和子项(从第一次迭代中调用它开始)都将调用fork
,并且每个子项都创建另一个子项。这就是为什么父节点正在创建for
。