Nel mio programma eseguo (in parallelo) processi figlio in un ciclo while finito e eseguo exec su ognuno di essi. Voglio che il processo padre riprenda l'esecuzione (il punto dopo questo ciclo while) solo dopo che tutti i bambini sono terminati. Come dovrei farlo?In attesa di tutti i processi figlio prima che il genitore riprenda l'esecuzione UNIX
ho provato diversi approcci. In un approccio, ho creato parent in pausa dopo ciclo e inviato alcune condizioni dal gestore SIGCHLD solo quando waitpid ha restituito errore ECHILD (nessun figlio rimanente) ma il problema che sto affrontando in questo approccio è ancora prima che il genitore abbia terminato di forgiare tutti i processi, retStat diventa -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
Ho bisogno di dare l'opzione WNOHANG perché se ci sono molti bambini che consegnano il segnale SIGCHLD quasi allo stesso tempo, e poiché i segnali non sono in coda in UNIX, se io uso 0, allora sarò in grado di catturare solo un segnale quindi gli zombi essere lasciato in giro. – avd
Solo per aggiungere un po ', il -1 controllerà ogni pid figlio (potrebbe usare anche WAIT_ANY per chiarezza). – amischiefr
@aditya: i processi zombi ti stanno solo aspettando di chiamare wait() (o wait_pid()) su di essi. Non appena lo fai, spariranno, indipendentemente dal fatto che tu abbia preso il segnale. Quindi il ciclo wait() dopo il ciclo fork() rimuoverà tutti gli zombi. –