Последний разветвленный ребенок не умрет - PullRequest
5 голосов
/ 23 октября 2011

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

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 ]

7 голосов
/ 23 октября 2011

Конец чтения канала не получит метку EOF, пока конец записи не будет закрыт всеми его пользователями.Родитель обоих потомков по-прежнему имеет оба конца канала открытыми, поэтому more не видит EOF (возврат 0 из read()) и продолжает ждать ввода большего числа.

0 голосов
/ 23 октября 2011

Проверьте с помощью ps axw, что это действительно more, который не умирает. Затем прочитайте справочную страницу для wait . Посмотрите на возвращенный статус для wait.

(Подсказка: посмотрите, что вызывает процесс «зомби». Я не думаю, что ожидания делают то, о чем вы думаете.)

...