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;
}
Tytuł tego pytania brzmi bardzo gwałtownie. – Marlon
@Marlon haha nie widział tego aż do teraz! – Pithikos