es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for 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 sistema wait() 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 encabezado sys/wait.h. Esta macro toma el valor devuelto por wait() 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 a printf("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 macro WEXITSTATUS.

Comments are closed.