En primer lugar, ninguna forma de salida de programa llamará automáticamente a destructores para objetos de montón (implícitos en ISO/IEC 14882: 1998 (E) 12.4.10).
Llamar a exit()
no llamará a los destructores para los objetos con duración automática, ya que no regresa a través de sus ámbitos adjuntos (3.6.1.4). Sin embargo, los destructores para objetos estáticos se llamarán, en orden inverso de construcción (18.3.8).
Llamando abort()
no llama a ningún destructores para ningún tipo de objeto, ni llama a atexit()
funciones registradas (18.3.3). La copia estándar de C++ que tengo aquí está un poco anticuada y no menciona _exit
o _Exit
directamente, pero me imagino que, si está presente, deberían comportarse igual, es decir, no llamar a ningún destructor. En particular, en el estándar C99, _Exit()
omite controladores atexit
(se define la implementación si los búferes de flujo se vacían, los flujos abiertos se cierran o los archivos temporales se eliminan).
nota además que abort()
puede ser cancelada por la captura de la señal SIGABRT
(ISO/IEC 9899: 1999 (E) 7.20.4.1.2 - Sólo tengo C99 aquí, pero espero que sería lo mismo en la versión de referencia de C++) _Exit()
no puede.
En una nota más práctica, en la mayoría de las implementaciones de UNIX de abort()
y _exit()
, abort()
plantea una SIGABRT
mientras _exit()
simplemente llama a una llamada de sistema operativo para terminar el proceso de inmediato. Esto significa que las principales diferencias son:
- Se puede especificar un código de salida de
_exit()
abort()
puede quedar atrapado por un manejador de señales
- Dependiendo de la configuración del sistema, sistema operativo, y ulimits,
abort()
puede dar lugar a un volcado de memoria o similares
En un patrón fork()/exec()
, _exit()
probablemente sería preferible, para evitar la posibilidad de volcado de memoria.
No creo que su "fork? Exec: _exit" capture exactamente cómo se usan normalmente. Sería más como: "(fork == 0)?/* Child */(exec, _exit):/* parent */(continue, wait)" – nobar
@nobar: Intenté darle un nombre tan corto al idioma como sea posible. Temía que pareciera que el código real incitaba a las personas a comenzar a comentar (como "olvidaste buscar errores"). –
Sí, habría hecho esos comentarios. Es una broma :) No, mi problema es que parece el código real (usando el operador "?:"), Y dado que es incorrecto, me causó cierta confusión. – nobar