represion - procesos secundarios ejemplos
Haga que los padres esperen a que finalicen todos los procesos secundarios (3)
POSIX define una función: wait(NULL);
Es la taquigrafía de waitpid(-1, NULL, 0);
, que suspenderá la ejecución del proceso de llamada hasta que finalice cualquier proceso secundario. Aquí, el primer argumento de waitpid
indica esperar a que finalice cualquier proceso hijo.
En su caso, haga que el padre lo llame desde su sucursal.
Espero que alguien pueda arrojar algo de luz sobre cómo hacer que el padre espere a que TODOS los procesos secundarios terminen antes de continuar después de la bifurcación. Tengo un código de limpieza que quiero ejecutar, pero los procesos secundarios deben haberse devuelto antes de que esto pueda suceder.
for (int id=0; id<n; id++) {
if (fork()==0) {
// Child
exit(0);
} else {
// Parent
...
}
...
}
Utilice waitpid () de esta manera:
pid_t childPid; // the child process that the execution will soon run inside of.
childPid = fork();
if(childPid == 0) // fork succeeded
{
// Do something
exit(0);
}
else if(childPid < 0) // fork failed
{
// log the error
}
else // Main (parent) process after fork succeeds
{
int returnStatus;
waitpid(childPid, &returnStatus, 0); // Parent process waits here for child to terminate.
if (returnStatus == 0) // Verify child process terminated without error.
{
printf("The child process terminated normally.");
}
if (returnStatus == 1)
{
printf("The child process terminated with an error!.");
}
}
pid_t child_pid, wpid;
int status = 0;
//Father code (before child processes start)
for (int id=0; id<n; id++) {
if ((child_pid = fork()) == 0) {
//child code
exit(0);
}
}
while ((wpid = wait(&status)) > 0); // this way, the father waits for all the child processes
//Father code (After all child processes end)