Убийство раздвоенного ребенка убивает родителя?
Я участвую в этом странном поведении, когда у меня есть моя основная программа и раздвоенный ребенок. Они подобны этим каналам (числа - файловые дескрипторы):
___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 ребенка, и это правильно.
Итак, почему родитель умирает?
Ответы
Ответ 1
Любая попытка родителя записать его в fd 1 или fd 2 после выхода из дочернего элемента приведет к тому, что ядро отправит SIGPIPE родительскому элементу. Поведение по умолчанию для SIGPIPE - это завершение процесса. Вероятно, это происходит.
Ответ 2
Вам нужно обрабатывать сигналы SIGPIPE
и SIGCHLD
- возможно, просто игнорировать их - и все должно быть в порядке.