Estoy en este comportamiento extraño donde tengo mi programa principal y un niño bifurcado. Ellos se canalizan como esto (los números son los descriptores de fichero):¿Un niño con bifurcación asesina mata al padre?
___parent___
| | ____child_____
| 0 stdin | | |
| 1 pipe1[1]----------. | 1 stdout |
| 2 pipe2[1]----------.\ | 2 stderr |
|____________| \`----------> 3 pipe1[0] |
`----------> 5 pipe2[0] |
|______________|
Así padre recibe el aporte de la entrada estándar pero redirige la salida estándar y stderr a dos tubos. El niño ha cerrado su stdin y en su lugar usa los extremos de lectura de las tuberías.
Entonces tienen una función simplemente matar al niño:
void killChild(){
printf("Killing %d\n", (int)childID);
fflush(stdout);
kill(childID, SIGKILL);
waitpid(childID, NULL, 0); // getting rid of the zombie
}
el niño se mataron con éxito, pero el problema es que los padres sí muere también. Revisé el PID del niño y es correcto.
Entonces, ¿por qué el padre muere?
Me encanta el nombre de esta pregunta. Y el arte. – Gabe
¿Qué señal recibió el padre? – hochl
¿El padre intenta escribir en stdout o stderr después de matar al niño? Si es así, muere debido al SIGPIPE. ¿Estás cambiando el manejo de SIGCHLD? –