2

有几个教程解释了atexit()函数的用法,例如:

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

示例在易于理解的 main 函数中给出。但是,我在我的程序中创建了一个共享库,并提供了一些要从其他程序导出的函数。当另一个程序卸载我的共享库时,我想停止共享库中的一些线程。如何atexit()在不强制用户调用某些函数的情况下在我的共享库实现中使用,例如destroy()最后?

提前致谢。

4

2 回答 2

7

文档指出:

从 glibc 2.2.3 开始,atexit()(和 on_exit(3))可以在共享库中用于建立卸载共享库时调用的函数。

另一方面,为什么不直接创建一个全局范围的对象并在其析构函数中执行整理代码呢?

于 2012-05-22T13:29:18.167 回答
5

你应该避免这样做(除非你真的因为某些非常强烈的理由必须这样做)。

该库应该只提供功能并让应用程序自由使用它。如果您的库导出了一个启动一些帮助线程的函数,请还提供一个函数来停止它并适当地记录它。继续履行应用程序释放其分配的资源的责任。

如果您的想法是修复确实调用了一些 lib_init() 但忘记了 lib_uninit() 的错误程序,那么请忘记它。它会让你的 lib 变得更加复杂,而且你永远无法修复应用程序的所有潜在错误。程序员可以创建和调试这样的应用程序将更加困难。

恕我直言,库应该(尽可能)避免更改一些全局过程的东西,因为这样的库会限制应用程序的设计方式。这样的库是一场噩梦,特别是如果您链接多个库并且它们对应用程序的编写方式有相互矛盾的假设。

于 2012-05-22T13:36:57.540 回答