¿Existe alguna diferencia entre las funciones on_exit() y atexit()?
Pregunta
¿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 con garantía de ejecución en configuraciones específicas, ¿debería preocuparme por esto?
Solución
De acuerdo a este enlace Descubrí que parece que hay algunas diferencias. on_exit
le permitirá pasar un argumento que se pasa al on_exit
funciona cuando se llama...lo que podría permitirle configurar algunos consejos para realizar un trabajo de limpieza cuando llegue 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 desees seguir con atexit, a pesar de que sea más restrictivo.
Otros consejos
Deberías 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) en su lugar.
La diferencia es que atexit
es C y on_exit
Hay una extraña extensión disponible en GNU y quién sabe qué otros sistemas Unixy (pero NO parte de POSIX).
@Nathan, no puedo encontrar ninguna función que devuelva el código de salida para el proceso en ejecución actual.Supongo que aún no se ha fijado el punto en el que atexit()
se llama, de todos modos.Con esto quiero decir que el tiempo de ejecución sabe qué es, pero probablemente no lo haya informado al sistema operativo.Sin embargo, esto es más o menos una conjetura.
Parece que necesitarás usar on_exit()
o estructurar su programa para que el código de salida no importe.No sería descabellado que la última declaración de su función principal cambie un valor global. exited_cleanly
variable a verdadero.En la función con la que te registras 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 se podría ampliar este tipo de esquema para admitir más estados de salida si fuera necesario.
@Natán
Primero, vea si hay otra llamada API para determinar el estado de salida...Un vistazo rápido y no veo ninguno, pero no estoy bien versado en 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 desconocida (si el programa finaliza de forma anormal).Luego, cuando llama 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 lo ideal, pero si no hay API y no quiere arriesgarse on_exit
no estar en la plataforma...puede que sea la única opción.