GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puede exit() fallar al terminar el proceso?

Sí, hay algunas circunstancias, tales como:

La función exit() primero llamará a todas las funciones registradas por atexit(), en el orden inverso de su registro, excepto que una función se llame después de cualquier función previamente registrada que ya se haya llamado en el momento en que se registró. Cada función se llama tantas veces como se registró. Si, durante la llamada a cualquiera de estas funciones, se realiza una llamada a la función longjmp() que terminaría la llamada a la función registrada, el comportamiento no está definido.

Si una función registrada por una llamada a atexit() no regresa, las funciones registradas restantes no se llamarán y el resto del procesamiento de exit() no se completará. Si exit() se llama más de una vez, el comportamiento no está definido.

Ver la página POSIX al salir.

Para obtener más información, adjunte un depurador cuando llegue a la situación y eche un vistazo a la pila de llamadas.


¿Estás llamando a exit()? del controlador de señales?

En man 7 signal , sección Funciones seguras para señales asíncronas puede ver todas las funciones que están garantizadas para funcionar cuando se las llama desde un controlador de señales:

Una función de manejo de señales debe ser muy cuidadosa, ya que el procesamiento en otra parte puede interrumpirse en algún punto arbitrario de la ejecución del programa. POSIX tiene el concepto de "función segura". Si una señal interrumpe la ejecución de una función no segura y el controlador llama a una función no segura, entonces el comportamiento del programa no está definido.

POSIX.1-2004 (también conocido como POSIX.1-2001 Technical Corrigendum 2) requiere una implementación para garantizar que las siguientes funciones se pueden llamar de forma segura dentro de un controlador de señales:

Ahí puedes ver las funciones _Exit() , _exit() y abort() , pero notablemente no exit() . Por lo tanto, no debe llamarlo desde un controlador de señales.

Lo desagradable es que incluso si llama a una función no segura desde un controlador de señales (printf() ¿Alguno?) funcionará la mayor parte del tiempo... pero no siempre.


Linux
  1. Procesos UNIX/Linux:Función C fork()

  2. Cómo llamar a la función C en C++, función C++ en C (Mezclar C y C++)

  3. ¿Cómo puede un proceso interceptar stdout y stderr de otro proceso en Linux?

  4. No se puede llamar a la función de biblioteca estándar de C en Linux de 64 bits desde el código ensamblador (yasm)

  5. ¿Qué hacer cuando Ctrl + C no puede matar un proceso?

¿Cómo matar un proceso en Linux? Comandos para Terminar

Llamada a función indefinida simplexml_load_file() – Error de PHP [Resuelto]

¿Cómo llamar a una función Bash en Bash Script dentro de Awk?

Cómo crear y llamar funciones en Bash

Procesos de Linux:diseño de memoria, salida y funciones C _exit

función de llamada declarada a continuación