Función wait en C
-
Usar la función
wait
para esperar el cambio de estado de los procesos hijos en C -
Usar la función
waitpid
para esperar un cambio de estado en un proceso hijo específico en C
Este artículo demostrará múltiples métodos sobre cómo usar la función wait
en C.
Usar la función wait
para esperar el cambio de estado de los procesos hijos en C
La función wait
es una envoltura para la llamada al sistema compatible con POSIX, definida en el archivo de cabecera <sys/wait.h>
. La función se utiliza para esperar los cambios de estado del programa en los procesos hijos y recuperar la información correspondiente. wait
se llama normalmente después de la llamada al sistema fork
que crea un nuevo proceso hijo. La llamada wait
suspende el programa que llama hasta que uno de sus procesos hijos termine.
El usuario debe estructurar el código para que haya dos caminos diferentes para el proceso que llama y el proceso hijo. Normalmente se consigue con la sentencia if...else
que evalúa el valor de retorno de la llamada a la función fork
. Tenga en cuenta que fork
devuelve el ID del proceso hijo, un entero positivo, en el proceso padre y devuelve 0 en el proceso hijo. fork
devolverá -1 si la llamada falla.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t c_pid = fork();
if (c_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (c_pid == 0) {
printf("printed from child process %d", getpid());
exit(EXIT_SUCCESS);
} else {
printf("printed from parent process %d\n", getpid());
wait(NULL);
}
exit(EXIT_SUCCESS);
}
Usar la función waitpid
para esperar un cambio de estado en un proceso hijo específico en C
waitpid
es una versión ligeramente mejorada de la función wait
que proporciona la característica de esperar al proceso hijo específico y modificar el comportamiento de activación del retorno. waitpid
puede devolver si el proceso hijo ha sido detenido o continuado adicionalmente al caso cuando el hijo es terminado.
En el siguiente ejemplo, llamamos a la función pause
desde el proceso hijo, que pasa a dormir hasta que se recibe la señal. Por otro lado, el proceso padre llama a la función waitpid
y suspende la ejecución hasta que el hijo regrese. También utiliza las macros WIFEXITED
y WIFSIGNALED
para comprobar si el proceso hijo ha terminado normalmente o ha terminado por la señal, respectivamente, y luego imprime el correspondiente mensaje de estado en la consola.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t child_pid, wtr;
int wstatus;
child_pid = fork();
if (child_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
printf("Child PID is %d\n", getpid());
pause();
_exit(EXIT_FAILURE);
} else {
wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
if (wtr == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
}
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook