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.