atexit()函数

时间:2012-05-22 13:24:48

标签: c++ linux shared-libraries

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

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

这些例子以主要功能给出,可以很容易地理解。但是,我正在我的程序中创建一个共享库,我提供了一些从其他程序导出的函数。当另一个程序卸载我的共享库时,我想在共享库中停止一些线程。如何在我的共享库实现中使用atexit()而不强迫用户调用某些函数,例如最后destroy()

提前致谢。

2 个答案:

答案 0 :(得分:7)

documentation州:

  

由于glibc 2.2.3,atexit()(和on_exit(3))可用于   共享库,用于建立共享时调用的函数   库已卸载。

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

答案 1 :(得分:6)

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

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

如果你的想法是修复那些调用某些lib_init()而忘记了lib_uninit()的错误程序,那么就算了。它会使你的lib变得更加复杂,你永远无法修复应用程序的所有潜在错误。程序员可以创建,然后调试这样的应用程序会更难。

恕我直言,图书馆应该(尽可能)避免改变一些全局流程的东西,因为这些库会限制应用程序的设计方式。这样的库是噩梦,特别是如果你链接多个库,并且他们对如何编写应用程序有相反的假设。