C ++ - fork()及其返回值

时间:2014-11-10 16:24:42

标签: c++ join fork wait

我在这个简单的练习中遇到了麻烦。这是代码:

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(儿子)的返回值。有什么建议?我非常感激。

2 个答案:

答案 0 :(得分:1)

由于第一个分支(设置pid1的分叉),第二个分支在不同的进程中运行。在pid1==0分支中,pid2永远不会获得值,因为该进程永远不会赋予它一个值。同样,在pid1>0分支中,pid3永远不会获得值。

看起来你期望这两个进程共享同一组变量,但它并不像那样工作。 Forking创建了两个独立的进程,每个进程都有自己的所有变量的副本。

答案 1 :(得分:0)

在你的程序中, pid1 pid3 是原始进程的子代(让我们称之为 pid0 ), pid2 pid1 的孩子。

变量pid1pid2等仅在特定进程中更新,并在其他进程中保持单一化。例如,在pid0之外的任何其他进程中等待 pid3 没有意义,因为其他进程不会正确设置pid3。此外,等待当前进程的子进程不起作用。

此外,wait系统调用将指针作为终止子进程返回值的参数。执行wait(pid2)不正确。

现在,要获得所需的结果,您必须在 pid1 pid0 之间设置某种通信通道,以便它们可以相互传输他们各自孩子的返回代码。 pid0 中创建的pipe可以解决这个问题。

系统调用参考: