Attendez que tous les processus enfants quittent

J’essaye de coder un tube shell dans c mais mon programme n’attend pas tout enfant avant de finir.

int fd[2]; if (fork() == 0) { dup2(fd[1], 1); close(0); execlp("ls", "ls, NULL); } if (fork() == 0) { dup2(fd[1], 1); close(0); execlp("wc" "wc", NULL); } wait(NULL);//this dont wait all child //wait(NULL); wait(NULL); this go into infinite loop //while (wait(NULL) > 0); this go into infinite loop write(1, "test", 4); 

Si j’utilise wait(NULL) , “test” est affiché au milieu de la sortie de wc et si j’utilise while (wait(NULL) > 0) ; il passe dans une boucle infinie.

Edit : La solution était de fermer le pipe ( close(fd[0]); close(fd[1]); ) avant l’attente. Je vais modifier à nouveau si je comprends comment cela fonctionne.

Chaque appel de wait(2) bloque le processus parent jusqu’à ce que l’un de ses enfants se termine. Donc, si vous voulez bloquer le processus parent jusqu’à ce que tous les enfants quittent, vous devez appeler wait() dans une boucle for autant de fois que vos processus enfants le sont.

while (wait(NULL) > 0) ne fonctionnera pas car wait() retourne le PID du processus enfant intercepté, donc toujours vrai, provoquant une boucle infinie.