2011-10-23 16 views
5

Ho il processo principale che si biforca due volte e quindi crea due bambini. I due bambini sono in filodiffusione con l'altro in questo modo:L'ultimo figlio biforcuto non morirà

ls | more 

Ora il problema è che il secondo figlio non muore mai. Perché? Quando muore veramente l'ultimo bambino in una pipa?

Rimozione una wait() chiamata mostra il risultato atteso di ls | more ma dà alcune ulteriori comportamenti strani (bloccato terminale ecc).

Ecco il mio codice:

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

Il titolo di questa domanda sembra molto violento. – Marlon

+0

@Marlon haha ​​non l'ho visto così fino ad ora! – Pithikos

risposta

6

La fine lettura del tubo non sarà possibile ottenere un segno EOF fino a quando la fine della scrittura è stata chiusa da tutti i suoi utenti. Il genitore di entrambi i bambini ha ancora entrambe le estremità del tubo aperto, quindi more non vede un EOF (un ritorno di 0 da read()) e continua ad attendere ulteriori input.

+0

Grazie, l'ha fatto! – Pithikos

0

Verificare con ps axw che è davvero il more che non sta morendo. Quindi leggi la pagina man per wait. Guarda lo stato restituito per wait.

(Suggerimento: guardo a ciò che provoca un processo di 'Zombie' Non credo che le attese stanno facendo ciò che si pensa che sono..)

+0

Lo hai fatto anche con "ps aux | grep more". Riesco a vedere il secondo bambino vivo e il prompt si blocca (aspettando il bambino). – Pithikos

Problemi correlati