Se sabe que tenedor() La llamada al sistema se utiliza para crear un nuevo proceso que se convierte en hijo del proceso que llama.
Al salir, el niño deja un estado de salida que debe devolverse al padre. Entonces, cuando el niño termina, se convierte en un zombi .
Cada vez que el niño sale o se detiene, el padre recibe un SEÑAL señal.
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.
(*)wait() llamada al sistema: suspende la ejecución del proceso de llamada hasta que uno de sus hijos finalice.
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 niños terminados, pero este comportamiento se puede modificar mediante el argumento de opciones como WIFEXITED WEXITSTATUS, etc.
El valor de pid puede ser:
- Menos de -1: significa esperar cualquier proceso hijo cuyo ID de grupo de proceso sea igual al valor absoluto de pid.
- Igual a -1: significa esperar por cualquier proceso secundario.
- Igual a 0: significa esperar a cualquier proceso hijo cuyo ID de grupo de proceso sea igual al del proceso que llama.
- Mayor que 0: significa esperar al hijo 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(estado): devuelve verdadero si el niño terminó normalmente.
WEXITSTATUS(estado): devuelve el estado de salida del niño. Esta macro debe utilizarse sólo si WIFEXITED devuelve verdadero.
A continuación se muestra una implementación de C en la que el niño usa ejecutar() función pero la ruta especificada para execl() no está definida.
Veamos cuál es el valor del estado de salida del hijo que recibe el padre.
// C code to find the exit status of child process #include #include #include #include #include // 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 %dn' 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.
A continuación se enumeran algunos códigos de estado de salida para obtener información adicional:
- 1: Errores diversos como "división por cero" y otras operaciones no permitidas.
-
2: Falta palabra clave, comando o problema de permiso. - 126: Problema de permiso o el comando no es un ejecutable
- 128: argumento no vá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.