función atexit()

Hay varios tutoriales que explican el uso de atexit() función como:

http://linux.die.net/man/3/atexit

Los ejemplos se dan en una función principal que se puede entender fácilmente. Sin embargo, estoy creando una biblioteca compartida en mi programa y proporciono algunas funciones para exportar desde otros programas. Quiero detener algunos hilos dentro de la biblioteca compartida cuando otro programa descarga mi biblioteca compartida. ¿Cómo puedo usar atexit() en mi implementación de biblioteca compartida sin obligar a los usuarios a llamar a alguna función, por ejemplo destroy() ¿al final?

Gracias de antemano.

preguntado el 22 de mayo de 12 a las 14:05

2 Respuestas

La documentación establece lo siguiente:

Desde glibc 2.2.3, atexit() (y on_exit(3)) se pueden usar dentro de una biblioteca compartida para establecer funciones que se llaman cuando se descarga la biblioteca compartida.

Por otro lado, ¿por qué no creas un objeto de alcance global y ejecutas tu código ordenado en su destructor?

contestado el 22 de mayo de 12 a las 14:05

Debe evitar hacerlo (a menos que realmente deba hacerlo por alguna razón realmente poderosa).

La librería solo debe proporcionar funciones y dejar que la aplicación tenga la libertad de usarla. Si su biblioteca exporta una función que inicia algunos subprocesos auxiliares, proporcione también una función para detenerla y documentarla adecuadamente. Mantenga la responsabilidad de la aplicación para liberar los recursos que asignó.

Si es tu idea arreglar programas defectuosos que llaman a lib_init() pero olvidan lib_uninit(), entonces olvídalo. Hará que su biblioteca sea mucho más compleja y nunca podrá corregir todos los posibles errores de la aplicación. programador puede crear, y la depuración de dicha aplicación será más difícil.

En mi humilde opinión, las bibliotecas deberían (en la medida de lo posible) evitar cambiar algunas cosas del proceso global porque tales bibliotecas causan limitaciones en la forma en que se puede diseñar la aplicación. Tales bibliotecas son una pesadilla, especialmente si se vincula con varias y tienen suposiciones contradictorias sobre cómo se debe escribir la aplicación.

contestado el 22 de mayo de 12 a las 14:05

@bugra +1 Estoy de acuerdo con la evaluación de mity. Si un programa (durante el funcionamiento normal) está descargando su biblioteca, entonces atexit() claramente no es la función correcta para llamar (es para la terminación normal del programa). Se debe realizar una llamada de función desde el programa host a su biblioteca para indicarle que libere sus recursos antes de que se descargue. - Ingeniería

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.