Я столкнулся с этим странным поведением, когда у меня есть моя основная программа и дочерняя. Они соединены вот так (цифры - дескрипторы файлов):
___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 ребенка и он правильный.
Так почему же родитель умирает?