compile - gcc linux install
¿Hay alguna diferencia entre las funciones on_exit() y atexit()? (5)
¿Hay alguna diferencia entre
int on_exit(void (*function)(int , void *), void *arg);
y
int atexit(void (*function)(void));
¿Aparte del hecho de que la función utilizada por on_exit obtiene el estado de salida?
Es decir, si no me importa el estado de salida, ¿hay alguna razón para usar uno u otro?
Editar: muchas de las respuestas advirtieron contra on_exit
porque no es estándar. Si estoy desarrollando una aplicación para uso corporativo interno y garantizada para ejecutarse en configuraciones específicas, ¿debería preocuparme por esto?
@ Nathan
Primero, vea si hay otra llamada API para determinar el estado de salida ... un vistazo rápido y no veo uno, pero no estoy muy familiarizado con la API C estándar.
Una alternativa fácil es tener una variable global que almacene el estado de salida ... el valor predeterminado es una causa de error desconocido (por si el programa termina anormalmente). Luego, cuando llame a exit, puede almacenar el estado de salida en el global y recuperarlo de cualquier función atexit. Esto requiere almacenar el estado de salida diligentemente antes de cada llamada de salida, y claramente no es ideal, pero si no hay API y no quiere arriesgarse a que on_exit
no esté en la plataforma ... podría ser la única opción.
@ Nathan, no puedo encontrar ninguna función que devuelva el código de salida para el proceso actual en ejecución. Espero que aún no esté configurado en el punto en que se llama a atexit()
. Con esto quiero decir que el tiempo de ejecución sabe de qué se trata, pero probablemente no lo haya informado al sistema operativo. Sin embargo, esto es solo una conjetura.
Parece que necesitará usar on_exit()
o estructurar su programa para que el código de salida no importe. No sería irracional tener la última declaración en su función principal voltear una variable global exited_cleanly
en verdadero. En la función que registra con atexit()
, puede verificar esta variable para determinar cómo salió el programa. Esto solo le dará dos estados, pero espero que sea suficiente para la mayoría de las necesidades. También puede expandir este tipo de esquema para admitir más estados de salida si es necesario.
De acuerdo con este enlace que encontré, parece que hay algunas diferencias. on_exit
le permitirá pasar un argumento que se transfiere a la función on_exit
cuando se lo llama ... lo que puede permitirle configurar algunos punteros para que hagan un trabajo de limpieza cuando sea el momento de salir.
Además, parece que on_exit
era una función específica de SunOS que puede no ser compatible en todas las plataformas ... por lo que es posible que desee seguir con atexit, a pesar de ser más restrictivo.
Debe usar atexit()
si es posible. on_exit()
no es estándar y es menos común. Por ejemplo, no está disponible en OS X.
Kernel.org - on_exit()
:
Esta función proviene de SunOS 4, pero también está presente en libc4, libc5 y glibc. Ya no ocurre en Solaris (SunOS 5). Evite esta función y use el atexit estándar (3).
La diferencia es que atexit
es C y on_exit
es una extraña extensión disponible en GNU y quién sabe qué otro sistema Unixy (pero NO es parte de POSIX).