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

时间:2011-10-23 18:00:11

标签: c linux pipe kill children

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

ls | more

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

删除一个 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;
}

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

ps axw核实,确实more确实没有死亡。然后阅读wait的手册页。查看wait的返回状态。

(提示:看看导致“僵尸”过程的原因。我不认为等待是按照你认为的那样做的。)