Подтвердить что ты не робот

Убийство раздвоенного ребенка убивает родителя?

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

 ___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 ребенка, и это правильно.

Итак, почему родитель умирает?

4b9b3361

Ответ 1

Любая попытка родителя записать его в fd 1 или fd 2 после выхода из дочернего элемента приведет к тому, что ядро ​​отправит SIGPIPE родительскому элементу. Поведение по умолчанию для SIGPIPE - это завершение процесса. Вероятно, это происходит.

Ответ 2

Вам нужно обрабатывать сигналы SIGPIPE и SIGCHLD - возможно, просто игнорировать их - и все должно быть в порядке.