En mi programa 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?Esperando todos los procesos secundarios antes de que el padre reanude la ejecución UNIX
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
Necesito dar la opción WNOHANG porque si hay muchos niños que entregan la señal SIGCHLD casi al mismo tiempo, y dado que las señales no están en cola en UNIX, si uso 0, entonces podré atrapar solo una señal y luego los zombis quedarte alrededor. – avd
Solo para agregar un bit, el -1 se comparará con cualquier pid niño (podría usar WAIT_ANY para mayor claridad también). – amischiefr
@aditya: Los procesos zombies solo esperan que usted llame a wait() (o wait_pid()) en ellos. Tan pronto como lo hagas, desaparecerán, ya sea que hayas captado o no la señal. Entonces, el bucle wait() después del bucle fork() borrará todos los zombies. –