2012-05-22 29 views
2

有幾個教程這解釋atexit()功能的使用,例如:的atexit()函數

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

這些實施例,其中可以很容易地理解一個主函數給出。但是,我在我的程序中創建了一個共享庫,並提供了一些從其他程序導出的功能。當另一個程序卸載我的共享庫時,我想停止共享庫中的一些線程。如何在我的共享庫實現中使用atexit()而不強制用戶調用某些函數,例如destroy()在結束?

在此先感謝。

+0

存在是不安全的。 –

回答

7

documentation狀態:

,因爲Glibc 2.2.3,atexit對()(和ON_EXIT(3))可以在 共享庫中被用於建立該被調用的函數,當共享庫 是卸載。

另一方面,爲什麼你不只是做一個全局範圍的對象,並在其析構函數中執行你的整理代碼?

6

你應該避免這樣做(除非你確實需要一些真正有力的理由)。

該庫應該只是提供功能,讓應用程序自由如何使用它。如果你的庫導出了一個啓動一些輔助線程的函數,還需要提供一個函數來停止它並適當地記錄它。繼續應用程序的責任,釋放它分配的資源。

如果你的想法是解決一些錯誤的程序,這些程序確實會調用lib_init()而忘記lib_uninit(),那麼就忘了它。它會讓你更加複雜,你永遠無法修復應用程序中的所有潛在錯誤。程序員可以創建,並且調試這樣的應用程序將變得更加困難。

恕我直言,圖書館應儘可能避免改變一些全球流程的東西,因爲這樣的圖書館造成如何設計應用程序的限制。這樣的圖書館是噩夢,特別是如果你與多個圖書館聯繫在一起,他們有矛盾的假設如何編寫應用程序。

+0

@bugra +1我同意mity的評估。如果一個程序(在正常操作期間)卸載你的庫,那麼'atexit()'顯然不是正確的函數調用(這是正常程序終止)。應該從主機程序向你的庫中調用一個函數,告訴它在卸載之前釋放它的資源。 –