atexit()函数

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

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

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

提前致谢。

该文件指出:

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

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

你应该避免这样做(除非你确实需要一些真正有力的理由)。

lib应该提供函数,让应用程序自由地使用它。 如果你的库导出了一个启动一些辅助线程的函数,那么还要提供一个函数来停止它并适当地记录它。 继续应用程序的责任来释放它分配的资源。

如果你的想法是修复那些叫做lib_init()但是忘记lib_uninit()的bug程序,那就把它忘掉。 它会使你的lib更复杂,你永远不能修复应用程序的所有潜在的错误。 程序员可以创建,调试这样的应用程序将是更困难的。

恕我直言,图书馆应尽可能避免改变一些全球过程的东西,因为这样的图书馆造成限制如何设计应用程序。 这样的图书馆是噩梦,特别是如果你与多个链接,他们有矛盾的假设如何写的应用程序。