fork()2个带管道的子节点,当wait()为两个时出错

时间:2012-05-14 13:17:04

标签: c++ fork wait pipeline

我有以下代码fork()来自公共父级的2个子代,并在它们之间实现管道。当我在父级中调用wait()函数时,只有程序运行完美。但是,如果我尝试两次调用wait()函数(从两个子节点中获取),程序什么都不做,必须强行退出。

有人能告诉我为什么我不能在这里等两个孩子吗?

int main()
{
    int status;
    int pipeline[2];
    pipe(pipeline);

    pid_t pid_A, pid_B;

    if( !(pid_A = fork()) )
    {
        dup2(pipeline[1], 1);
        close(pipeline[0]);
        close(pipeline[1]);
        execl("/bin/ls", "ls", 0);
    }

    if( !(pid_B = fork()) )
    {
        dup2(pipeline[0], 0);
        close(pipeline[0]);
        close(pipeline[1]);
        execl("/usr/bin/wc", "wc", 0);
    }

    wait(&status);
    wait(&status);
}

2 个答案:

答案 0 :(得分:3)

分叉子项后,需要在父项中关闭管道的两端。问题是ls的输出将转移到父级,wc正在等待输入。因此,第一次等待会清除ls,但第二次等待wc,它会在未接收数据的管道上被阻止。

答案 1 :(得分:3)

进程B(wc)在其输入流上收到文件结束之前不会终止。管道的另一端作为进程A的输出流和父进程中的pipeline[1]共享,因此在等待进程B之前,您需要在父进程中close(pipeline[1])。 / p>