Sono in questo comportamento strano dove ho il mio programma principale e un bambino biforcuto. Essi sono in filodiffusione come questo (i numeri sono descrittori di file):Uccidere un figlio biforcuto uccide il genitore?
___parent___
| | ____child_____
| 0 stdin | | |
| 1 pipe1[1]----------. | 1 stdout |
| 2 pipe2[1]----------.\ | 2 stderr |
|____________| \`----------> 3 pipe1[0] |
`----------> 5 pipe2[0] |
|______________|
Così genitore ottiene input da stdin ma reindirizza stdout e stderr a due tubi. Il bambino ha chiuso il suo stdin e utilizza invece le estremità di lettura dei tubi.
Poi ho una funzione di uccidere solo il bambino:
void killChild(){
printf("Killing %d\n", (int)childID);
fflush(stdout);
kill(childID, SIGKILL);
waitpid(childID, NULL, 0); // getting rid of the zombie
}
il bambino si successo ucciso, ma il problema è che il genitore stesso viene ucciso pure. Ho controllato il PID del bambino ed è corretto.
Quindi perché il genitore muore?
Mi piace il nome di questa domanda. E l'arte. – Gabe
Quale segnale ha ricevuto il genitore? – hochl
Il genitore tenta di scrivere su stdout o stderr dopo aver ucciso il bambino? Se è così, muore a causa della SIGPIPE. Stai cambiando la gestione di SIGCHLD? –