有几个教程解释了atexit()函数的用法,例如:
http://linux.die.net/man/3/atexit
示例以易于理解的main函数形式给出。但是,我在我的程序中创建了一个共享库,并且我提供了一些从其他程序导出的函数。当另一个程序卸载我的共享库时,我想停止共享库中的一些线程。我如何在我的共享库实现中使用atexit(),而不强制用户在最后调用某些函数,例如destroy()?
提前谢谢。
发布于 2012-05-22 21:29:18
documentation声明:
从glibc 2.2.3开始,可以在共享库中使用atexit() (和on_exit(3))来建立在卸载共享库时调用的函数。
另一方面,为什么不创建一个全局作用域的对象,并在其析构函数中执行整理代码?
发布于 2012-05-22 21:36:58
你应该避免这样做(除非你真的因为一些非常强烈的原因而必须这样做)。
lib应该只提供函数,并让应用程序自由使用它。如果您的库导出了一个启动了一些帮助线程的函数,那么还应该提供一个函数来停止它并对其进行适当的文档记录。保留应用程序释放其分配的资源的责任。
如果你的想法是修复有but的程序,这些程序确实调用了一些lib_init(),但是忘记了lib_uninit(),那么就忘了它吧。它会让你的lib变得更加复杂,而且你永远无法修复应用程序中所有潜在的bug。程序员可以创建,而调试这样的应用程序将变得更加困难。
IMHO,库应该(尽可能)避免更改一些全局进程的东西,因为这样的库会限制应用程序的设计。这样的库是噩梦,特别是当你链接到多个库,并且它们有矛盾的假设应该如何编写应用程序时。
https://stackoverflow.com/questions/10702980
复制相似问题