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

Pit*_*kos 5 c linux children kill pipe

我有两次主要过程,因此创造了两个孩子.这两个孩子彼此用管道输送:

ls | more
Run Code Online (Sandbox Code Playgroud)

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

删除一个wait()调用会显示预期的结果,ls | more但会给出一些更奇怪的行为(卡住终端等).

这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

nin*_*alj 7

在所有用户关闭写入结束之前,管道的读取端将不会获得EOF标记.两个孩子的父母仍然打开管道的两端,因此more没有看到EOF(从0返回read()),并且一直等待更多输入.