2011-10-23 15 views
5

Tengo el proceso principal bifurcado dos veces y, por lo tanto, creo dos hijos. Los dos niños se canalizan entre sí de esta manera:El último hijo ahorquillado no va a morir

ls | more 

Ahora el problema es que el segundo hijo nunca muere. ¿Porqué es eso? ¿Cuándo muere realmente el último niño en una tubería?

Al eliminar wait() la llamada muestra el resultado esperado de ls | more, pero da algunos comportamientos extraños (terminal atascado, etc.).

Aquí está mi código:

int main(){ 
    printf("[%d] main\n", getpid()); 
    int pip[2], i; 
    pipe(pip); 

    /* CHILDREN*/ 
    for (i=0; i<2; i++){ 
    if (fork()==0){ 

     /* First child */ 
     if (i==0){ 
     printf("[%d] child1\n", getpid()); 
     close(1); dup(pip[1]); 
     close(pip[0]); 
     execlp("ls", "ls", NULL);} 

     /* Second child */ 
     if (i==1){ 
     printf("[%d] child2\n", getpid()); 
     close(0); dup(pip[0]); 
     close(pip[1]); 
     execlp("more", "more", NULL);} 
    } 
    } 
    wait(NULL); // wait for first child 
    wait(NULL); // wait for second child 
    return 0; 
} 
+1

El título de esta pregunta suena muy violento. – Marlon

+0

@Marlon jaja no lo veía así hasta ahora! – Pithikos

Respuesta

6

La lectura final de la tubería no tendrá una marca EOF hasta que el final de escritura haya sido cerrado por todos sus usuarios. El padre de ambos hijos todavía tiene abiertos los dos extremos de la tubería, por lo que more no ve un EOF (un retorno de 0 desde read()), y sigue esperando por más información.

+0

¡Gracias, eso fue todo! – Pithikos

0

Comprobar con ps axw que es realmente el more que no está muriendo. Luego lea la página del manual para wait. Mire el estado devuelto para wait.

(Pista: mira lo que provoca un proceso 'zombi' No creo que las esperas están haciendo lo que usted piensa que son..)

+0

Han hecho eso también con "ps aux | grep more". Puedo ver al segundo niño vivo y el mensaje simplemente se cuelga (esperando al niño). – Pithikos

Cuestiones relacionadas