cómo salir de un proceso hijo – _exit() vs. exit

4 minutos de lectura

avatar de usuario
método auxiliar

Considere este fragmento de código:

pid_t cpid = fork();

if (cpid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
}

if (cpid == 0) { // in child
    execvp(argv[1], argv + 1);
    perror("execvp");
    _exit(EXIT_FAILURE);
}

// in parent

¿Cómo debo salir del proceso secundario si regresa execvp? ¿Debería usar exit() o _exit()?

avatar de usuario
Codificador de longitud variable

Definitivamente deberías usar _Exit(). exit() llama a las funciones que agregó con atexit() y elimina los archivos creados con tmpfile(). Dado que el proceso principal es realmente el que quiere que se hagan estas cosas cuando existe, debe llamar _Exit()que no hace nada de esto.

Aviso _Exit() con e mayúscula _exit(2) probablemente no es lo que desea llamar directamente. exit(3) y _Exit(3) llamará esto por ti. si no tienes _Exit(3)entonces sí, _exit() es lo que querías.

  • +1 Desea que el proceso secundario fallido salga silenciosamente como si nunca se hubiera creado.

    – John Kugelmann

    24 de febrero de 2010 a las 21:49

  • Bueno, dado que el antiguo estándar C permitía que el enlazador resolviera mayúsculas y minúsculas, _Exit() no puede ser una función de biblioteca estándar, ya que entraría en conflicto con el antiguo _exit(). Lo siento.

    – Josué

    24 de febrero de 2010 a las 21:50

  • De lo contrario. _Exit(3) es una biblioteca C estándar (ISO C99). _exit(2) es una llamada al sistema POSIX.1 y no un estándar C.

    – Codificador de longitud variable

    25 de febrero de 2010 a las 1:06

  • Si los recursos abiertos, como los archivos, se cierran después de llamar _Exit está definida la implementación. Probablemente no desee este comportamiento (con respecto a las secuencias no descargadas). Todas las páginas man que he visto dicen que _exit no vacía los flujos, por lo que es más seguro si un archivo tiene contenido no vaciado cuando ocurre una bifurcación. El hecho de que _exit no es estándar C es un punto discutible, ya que fork también es específico de Unix. El comité de estándares C puede tener razones especiales para introducir _Exitpero no hay razón para que los programadores de Unix cambien _exit para _Exit en absoluto. @VariableLengthCoder

    –Yongwei Wu

    13 de diciembre de 2017 a las 4:39

El hijo de fork() siempre debe llamar a _exit().

Llamar a exit() en su lugar es una buena manera de hacer que los búferes de stdio pendientes se vacíen dos veces.

  • exec no regresa excepto por error, en el que llama a _exit.

    – Josué

    14 de febrero de 2014 a las 4:01

avatar de usuario
Nicolás Guillermo

execvp saldrá del niño si tiene éxito para que no tenga que salir.

En caso de falla ejecutiva, simplemente uso exit(EXIT_FAILURE); en el niño

Editar: encontré que después de algunas investigaciones: http://www.unixguide.net/unix/programming/1.1.3.shtml

Así que parece que es mejor usar _exit() en un fork child especialmente cuando estás en C++ :p Gracias por tu pregunta aprendí algo 😀

Depende del comportamiento que quieras: man -s 3 exit y man _exit para obtener más detalles sobre su sistema. En general, creo que _exit no ejecuta funciones que están registradas con atexit() mientras que exit sí lo hace (es mejor que estas funciones no llamen a exit; de lo contrario, obtienes recursividad).

En general, preferiría exit sobre _exit, excepto en las funciones registradas con atexit, en las que llamaría _exit, si es necesario.

avatar de usuario
ImanKh

exit() es una función ANSI-C y, por lo tanto, es independiente del sistema operativo. Cierra todas las funciones estándar ANSI-C.
_exit() es llamado por exit() para cerrar funcionalidades dependientes del sistema operativo, porque exit() no tiene idea de ellos.(exit es independiente del sistema operativo)

  • “_exit () es una función del kernel de Linux” no es correcto, consulte pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

    – Dr. Jan-Philip Gehrcke

    06/10/2016 a las 11:37

  • Tienes razón en eso, pero el resto de mi comentario es cierto. Consulte: Programación de sistemas Unix por David Curry, página 291.

    – ImanKh

    06/10/2016 a las 17:39


  • “_exit () es una función del kernel de Linux” no es correcto, consulte pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

    – Dr. Jan-Philip Gehrcke

    06/10/2016 a las 11:37

  • Tienes razón en eso, pero el resto de mi comentario es cierto. Consulte: Programación de sistemas Unix por David Curry, página 291.

    – ImanKh

    06/10/2016 a las 17:39


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad