Killing forked child kills parent?

Я столкнулся с этим странным поведением, когда у меня есть моя основная программа и дочерняя. Они соединены вот так (цифры - дескрипторы файлов):

 ___parent___
|            |                     ____child_____
| 0 stdin    |                    |              |
| 1 pipe1[1]----------.           |  1 stdout    |
| 2 pipe2[1]----------.\          |  2 stderr    |
|____________|         \`----------> 3 pipe1[0]  | 
                        `----------> 5 pipe2[0]  |
                                  |______________|

Итак, родитель получает входные данные от stdin, но перенаправляет stdout и stderr в две трубы. Ребенок закрыл свой stdin и вместо него использует концы труб для чтения.

Затем у меня есть функция, чтобы просто убить ребенка:

void killChild(){
  printf("Killing %d\n", (int)childID);
  fflush(stdout);
  kill(childID, SIGKILL);
  waitpid(childID, NULL, 0);   // getting rid of the zombie
}

Ребенок успешно убит, но проблема в том, что сам родитель тоже убит. Я проверил PID ребенка и он правильный.

Так почему же родитель умирает?

12
задан Roman Nikitchenko 22 November 2011 в 13:53
поделиться