exit(1) en el proceso hijo devuelve 256 en el proceso padre en Linux.
Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.
Soy nuevo en la programación de sistemas operativos. Estoy tratando de averiguar el mecanismo de creación de procesos utilizando la llamada al sistema fork() en Linux. Por lo tanto, he escrito el siguiente código.
“` include <stdio.h>
include <sys types.h="">
include <sys wait.h="">
include <unistd.h>
include <stdlib.h>
int main() {
pid_t pid;
int status;
pid = fork();
if(pid<0) {
fprintf(stderr,"Error: Child can't be created\n");
} else if(pid == 0) {
printf("Hi I am child : %d\n",getpid());
printf("Child finished\n");
exit(1);
} else {
printf("Hi! I am parent : %d\n",getpid());
pid = wait(&status);
printf("After that parent get : %d of child %d\n",status,pid);
printf("Parent finished\n");
}
return 0;
}
“`
Según mi conocimiento, el proceso padre obtiene el estado de salida de su proceso hijo después de su terminación a través de la llamada al sistema wait(). Cuando estoy pasando 0 a la función exit() en el proceso hijo, el padre también obtiene 0 como estado. Pero cuando paso 1, el proceso padre obtiene 256. Aquí hay una captura de pantalla de la salida de referencia.
Mi pregunta es por qué está sucediendo esto y cómo. Por favor explique.
Gracias de antemano.</stdlib.h></unistd.h></stdio.h>
davy.ai
Cuando un proceso termina, devuelve un estado de salida a su proceso padre. Este estado de salida es un valor entero entre 0 y 255, donde 0 indica una terminación normal y cualquier valor distinto de cero indica una terminación anormal.
En el código que se proporcionó, cuando el proceso hijo llama a
exit(0)
, devuelve un estado de 0 a su proceso padre. Es por eso que el proceso padre imprime el estado de salida como 0.Sin embargo, cuando el proceso hijo llama a
exit(1)
, devuelve un estado de 1 a su proceso padre. Pero la llamada al sistemawait()
devuelve un valor que combina el estado de salida y información adicional sobre cómo se terminó el proceso hijo.Para extraer el estado de salida real, necesita utilizar la macro
WEXITSTATUS
, que está definida en el archivo de encabezadosys/wait.h
. Esta macro toma el valor devuelto porwait()
como argumento y devuelve el estado de salida del proceso hijo. Entonces, en su código, puede modificar la línea que imprime el estado de salida aprintf("Después de eso, el padre obtiene: %d del hijo %d\n",WEXITSTATUS(status),pid);
y imprimirá 1 cuando el proceso hijo salga con un estado de salida de 1.En resumen, el valor del estado de salida devuelto por un proceso hijo se combina con información adicional por la llamada al sistema
wait()
. Para extraer el estado de salida real, necesita utilizar la macroWEXITSTATUS
.