最后一个分叉的孩子不会死

我有两个主要的过程分叉,从而创造两个孩子。 这两个孩子是这样互相配pipe的:

ls | more 

现在的问题是,第二个孩子永远不会死亡。 这是为什么? 什么时候pipe道中的最后一个孩子真的死了?

除去一个wait()调用显示ls | more的预期结果 ls | more但给出了一些更奇怪的行为(卡住terminal等)。

这是我的代码:

 int main(){ printf("[%d] main\n", getpid()); int pip[2], i; pipe(pip); /* CHILDREN*/ for (i=0; i<2; i++){ if (fork()==0){ /* First child */ if (i==0){ printf("[%d] child1\n", getpid()); close(1); dup(pip[1]); close(pip[0]); execlp("ls", "ls", NULL);} /* Second child */ if (i==1){ printf("[%d] child2\n", getpid()); close(0); dup(pip[0]); close(pip[1]); execlp("more", "more", NULL);} } } wait(NULL); // wait for first child wait(NULL); // wait for second child return 0; } 

Solutions Collecting From Web of "最后一个分叉的孩子不会死"

直到写入结束被其所有用户关闭,管道的读取结束才会得到EOF标记。 两个孩子的父母仍然有管道的两端打开,所以more没有看到一个EOF(从read()返回0),并不断等待更多的输入。

ps axw检查ps axw ,它确实是不会死的。 然后阅读手册页等待 。 看看返回的wait状态。

(提示:看看是什么原因导致了僵尸进程,我不认为这些等待是按照你自己的想法进行的。)