Esperando todos los procesos secundarios antes de que el padre reanude la ejecución UNIX

En mi progtwig, estoy bifurcando (en paralelo) procesos secundarios en un ciclo while finito y haciendo exec en cada uno de ellos. Quiero que el proceso padre reanude la ejecución (el punto después de este ciclo while) solo después de que todos los hijos hayan terminado. ¿Cómo debo hacer eso?

He intentado varios enfoques. En un enfoque, hice parent pause after loop y envié alguna condición del controlador SIGCHLD solo cuando waitpid devolvió el error ECHILD (no queda ningún hijo) pero el problema al que me enfrento en este enfoque es incluso antes de que el padre haya terminado de bifurcar todos los procesos, retStat se convierte -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 

En lugar de llamar a waitpid en el manejador de señal, ¿por qué no crear un bucle después de haber bifurcado todos los procesos de la siguiente manera:

 while (pid = waitpid(-1, NULL, 0)) { if (errno == ECHILD) { break; } } 

El progtwig debe colgarse hasta que no haya más niños. Luego se caerá y el progtwig continuará. Como una ventaja adicional, el ciclo se bloqueará en waitpid mientras los niños están en ejecución, por lo que no necesita un bucle ocupado mientras espera.

También podría usar wait(NULL) que debería ser equivalente a waitpid(-1, NULL, 0) . Si no hay nada más que deba hacer en SIGCHLD, puede configurarlo en SIG_IGN.

Creo que deberías usar la llamada a waitpid() . Te permite esperar a “cualquier proceso secundario”, por lo que si lo haces la cantidad adecuada de veces, deberías estar dorado.

Si eso falla (no estoy seguro de las garantías), podría hacer el enfoque de fuerza bruta sentado en un bucle, haciendo un waitpid() con la opción NOHANG en cada uno de los PID de su hijo, y luego demorando un poco antes de volver a hacerlo .