Se sabe que la llamada al sistema fork() se usa para crear un nuevo proceso que se convierte en hijo del proceso que llama.
Al salir, el hijo deja un estado de salida que debe devolverse al padre. Así, cuando el niño termina se convierte en zombie .
Cada vez que el niño sale o se detiene, el padre recibe una señal SIGCHLD .
El padre puede usar la llamada al sistema wait() o waitpid() junto con las macros WIFEXITED y WEXITSTATUS para conocer el estado de su hijo detenido.
(*) llamada al sistema wait() : Suspende la ejecución del proceso de llamada hasta que finaliza uno de sus hijos.
Sintaxis de la llamada al sistema wait():
pid_t wait(int *status);
(*) La llamada al sistema waitpid(): suspende la ejecución del proceso de llamada hasta que un elemento secundario especificado por el argumento pid haya cambiado de estado.
Sintaxis de la llamada al sistema waitpid():
pid_t waitpid(pid_t pid, int *status, int options)
Nota: De forma predeterminada, waitpid() espera solo a los hijos terminados, pero este comportamiento se puede modificar a través del argumento de opciones, como WIFEXITED, WEXITSTATUS, etc.
El valor de pid puede ser:
- Menos de -1: lo que significa esperar a cualquier proceso secundario cuyo ID de grupo de procesos sea igual al valor absoluto de pid.
- Igual a -1: Significa esperar por cualquier proceso secundario.
- Igual a 0: lo que significa esperar a cualquier proceso secundario cuyo ID de grupo de procesos sea igual al del proceso que llama.
- Mayor que 0: lo que significa esperar al niño cuyo ID de proceso es igual al valor de pid.
WIFEXITED y WEXITSTATUS son dos de las opciones que se pueden utilizar para conocer el estado de salida del niño.
WIFEXITED(status): devuelve verdadero si el hijo terminó normalmente.
WEXITSTATUS(status) : devuelve el estado de salida del niño. Esta macro debe emplearse solo si WIFEXITED devolvió verdadero.
A continuación se muestra una implementación de C en la que el niño usa la función execl() pero la ruta especificada para execl() no está definida.
Veamos cuál es el valor de estado de salida del niño que obtiene el padre.
C
// C code to find the exit status of child process #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl("/bin/sh", "bin/sh", "-c", "./nopath", "NULL"); } int status; waitpid(pid, &status, 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf("Exit status of the child was %d\n", exit_status); } return 0; }
Producción:
Nota: Es posible que el código anterior no funcione con el compilador en línea ya que fork() está deshabilitado.
Aquí el estado de salida es 127, lo que indica que hay algún problema con la ruta o hay un error tipográfico.
Algunos códigos de estado de salida se enumeran a continuación para obtener información adicional:
- 1: Errores diversos, como «dividir por cero» y otras operaciones no permitidas.
- 2: Falta la palabra clave o el comando, o problema de permisos.
- 126 : Problema de permisos o el comando no es un ejecutable
- 128: argumento inválido para salir.
Nota: el estándar C no define el significado de los códigos de retorno. Las reglas para el uso de códigos de retorno varían en diferentes plataformas.
Publicación traducida automáticamente
Artículo escrito por mazhar_mik y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA