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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top