2011-10-23 10 views
5

Mam główny proces rozwidlenia dwa razy, a tym samym tworzenie dwoje dzieci. Dwoje dzieci są rurami ze sobą tak:Ostatnie rozwidlone dziecko nie umrze

ls | more 

Teraz problemem jest to, że drugie dziecko nigdy nie umiera. Dlaczego? Kiedy naprawdę umiera ostatnie dziecko w rurze?

Usunięcie jednego wait() wezwanie pokazuje oczekiwany rezultat ls | more ale daje pewne dalsze zachowania dziwaczne (zatrzymany terminala itp).

Oto mój kod:

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

Tytuł tego pytania brzmi bardzo gwałtownie. – Marlon

+0

@Marlon haha ​​nie widział tego aż do teraz! – Pithikos

Odpowiedz

6

Odczyt koniec rury nie otrzyma znaku EOF dopóki koniec zapisu nie zostanie zamknięty przez wszystkich jego użytkowników. Rodzic obu dzieci nadal ma otwarte oba końce rury, więc more nie widzi EOF (powrót 0 z read()) i wciąż czeka na więcej danych wejściowych.

+0

Dzięki, to się udało! – Pithikos

0

Sprawdź z ps axw że to naprawdę more który nie umiera. Następnie przeczytaj stronę podręcznika dla wait. Przyjrzyj się zwróconemu statusowi dla wait.

(Podpowiedź: patrzeć na to, co powoduje, że proces „zombie” Nie sądzę, że czeka robią to, co myślą, że są.).

+0

Zrobiliśmy to również z "ps aux | grep more". Widzę drugie dziecko przy życiu, a podpowiedź po prostu wisi (czeka na dziecko). – Pithikos

Powiązane problemy