1

我有以下代码 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);
}
4

2 回答 2

3

分叉子项后,您需要关闭父项中管道的两端。问题是输出ls到父级,并且wc正在等待输入。因此,第一个等待清除了ls,但第二个等待wc在未接收数据的管道上被阻塞。

于 2012-05-14T13:36:26.163 回答
3

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

于 2012-05-14T13:38:31.167 回答