我在这个简单的练习中遇到了麻烦。这是代码:
int main(int argc, char** argv) {
pid_t pid1,pid2,pid3;
int a=5,b=4,c=3,retval,retval2;
pid1=fork();
if(pid1==0){
pid3=fork();
if(pid3==0)
exit(a);
else if(pid3>0){
waitpid(pid2,&retval2,0);
cout<<WEXITSTATUS(retval2);
}
}
else if(pid1>0){
pid2=fork();
if(pid2==0){
cout<<"CIAO";
exit(b);
}
else if(pid2>0){
waitpid(pid3,&retval,0);
cout<<WEXITSTATUS(retval);
}
}
return 0; }
你可以看到它并不复杂。我想做的就是pid2(父亲)打印pid3(儿子)的返回值和pid3(父亲)来打印pid2(儿子)的返回值。有什么建议?我非常感激。
答案 0 :(得分:1)
由于第一个分支(设置pid1
的分叉),第二个分支在不同的进程中运行。在pid1==0
分支中,pid2
永远不会获得值,因为该进程永远不会赋予它一个值。同样,在pid1>0
分支中,pid3
永远不会获得值。
看起来你期望这两个进程共享同一组变量,但它并不像那样工作。 Forking创建了两个独立的进程,每个进程都有自己的所有变量的副本。
答案 1 :(得分:0)
在你的程序中, pid1 和 pid3 是原始进程的子代(让我们称之为 pid0 ), pid2 是 pid1 的孩子。
变量pid1
,pid2
等仅在特定进程中更新,并在其他进程中保持单一化。例如,在pid0之外的任何其他进程中等待 pid3 没有意义,因为其他进程不会正确设置pid3
。此外,等待当前进程的子进程不起作用。
此外,wait
系统调用将指针作为终止子进程返回值的参数。执行wait(pid2)
不正确。
现在,要获得所需的结果,您必须在 pid1 和 pid0 之间设置某种通信通道,以便它们可以相互传输他们各自孩子的返回代码。 pid0 中创建的pipe
可以解决这个问题。
系统调用参考: