Dans mon programme, je suis en train de forcer (en parallèle) les processus fils dans une boucle while finie et de faire exec sur chacun d'eux. Je veux que le processus parent reprenne l'exécution (le point après cette boucle while) seulement après que tous les enfants se soient terminés. Comment devrais-je faire ça?Attente de tous les processus enfants avant que le parent ne reprenne l'exécution UNIX
J'ai essayé plusieurs approches. Dans une approche, j'ai fait une pause parent après boucle while et envoyé une condition du gestionnaire SIGCHLD seulement quand waitpid retournait l'erreur ECHILD (aucun enfant restant) mais le problème auquel je suis confronté dans cette approche est avant même que parent ait fini de forcer tous les processus, retStat devient -1
void sigchld_handler(int signo) {
pid_t pid;
while((pid= waitpid(-1,NULL,WNOHANG)) > 0);
if(errno == ECHILD) {
retStat = -1;
}
}
**//parent process code**
retStat = 1;
while(some condition) {
do fork(and exec);
}
while(retStat > 0)
pause();
//This is the point where I want execution to resumed only when all children have finished
Je dois donner l'option WNOHANG parce que s'il y a beaucoup d'enfants qui délivrent le signal SIGCHLD presque en même temps, et que les signaux ne sont pas mis en file d'attente sous UNIX, si j'utilise 0, je ne pourrai attraper qu'un seul signal être laissé. – avd
Juste pour ajouter un peu, le -1 vérifiera tout enfant pid (pourrait utiliser WAIT_ANY pour plus de clarté aussi). – amischiefr
@aditya: Les processus zombies n'attendent que vous pour appeler wait() (ou wait_pid()). Dès que vous le faites, ils disparaissent, que vous ayez ou non attrapé le signal. Ainsi, la boucle wait() après la boucle fork() épongera tous les zombies. –