2011-11-22 11 views
12

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?

+5

Me encanta el nombre de esta pregunta. Y el arte. – Gabe

+3

¿Qué señal recibió el padre? – hochl

+5

¿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? –

Respuesta

13

Cualquier intento por parte del padre de escribir en su fd 1 o fd 2 después de que el hijo salga dará como resultado que el kernel envíe SIGPIPE al padre. El comportamiento predeterminado para SIGPIPE es la terminación del proceso. Eso es probablemente lo que está pasando.

+1

Ese fue de hecho el problema. Solo 'close()' resolvió las tuberías en el padre. Ahora solo tengo que encontrar una forma de restablecer stdout y stderr. – Pithikos

+3

@Pithikos dup() stdout/stderr antes de crear las tuberías. Después de cerrar los conductos, dup2() vuelve al descriptor 1/2 nuevamente. – nos

2

Necesita manejar las señales SIGPIPE y SIGCHLD, posiblemente simplemente ignórelas, y debería estar bien.

+2

Y tal vez sea una buena idea esperar a los niños que terminaron, ya sabes, los zombies ... – hochl

+1

Él ya lo hace, así que no hice ningún comentario al respecto. – pajton

Cuestiones relacionadas