我有以下代码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);
}
答案 0 :(得分:3)
分叉子项后,需要在父项中关闭管道的两端。问题是ls
的输出将转移到父级,wc
正在等待输入。因此,第一次等待会清除ls
,但第二次等待wc
,它会在未接收数据的管道上被阻止。
答案 1 :(得分:3)
进程B(wc
)在其输入流上收到文件结束之前不会终止。管道的另一端作为进程A的输出流和父进程中的pipeline[1]
共享,因此在等待进程B之前,您需要在父进程中close(pipeline[1])
。 / p>