Последний дочерний форк не умирает

У меня главный процесс развивался два раза и таким образом создал двух детей. Эти два дочерних процесса передаются друг другу вот так:

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;
}
5
задан Mat 23 October 2011 в 18:05
поделиться