2011-11-05 92 views
2

我有一個在c庫中定義的全局變量[例如:int globalcount = 0] 和庫初始化函數[說library_init] globalcount增加1。動態變量具有靜態存儲行爲與使用dlopen加載庫時的動態變量

這裏的問題是:當庫使用dlopen和申請電話library_init功能打開和使用dlclose然後再dlopen的呼叫正在重置的globalcount 0

閉庫,我想知道如何防止全局復位變量[我想globalcount必須是1而不是0] 當下一個dlopen被調用,因爲進程不是退出所以全局變量也不能退出等。

如果庫鏈接到在鏈接時使用-l進行處理,我不面臨abv問題。 只有當庫打開使用dlopen /問題dlclose [多次]

在Linux操作系統上 PROG蘭:C 編譯器:GCC

怎麼辦,在數據段的內存不能釋放時dlclose叫?

+0

這是一個操作系統問題,而不是語言問題。如果你告訴我們操作系統,它可能會有幫助(儘管我懷疑它)。當調用dlclose()時,如何將變量的狀態保存到文件中。 –

+0

操作系統是Linux,我們不想將任何想法保存到一個文件中,我認爲它不是一個好方法。是否有任何方式使用靜態存儲類可以解決abv問題 – Syedsma

+0

我認爲你應該問問自己你爲什麼要在該庫上執行'dlclose'的問題。我想不出多大用處。 –

回答

1

當你調用dlclose時,你的dll被卸載,這意味着你的庫的數據段中的任何內存都被釋放。這就是將值重置爲0的原因。即使您的庫已卸載,您也可以使用shared memory來創建一個持久變量。

+0

是否有任何最簡單的方法,使我可以在整個流程生命中使用verialbe? – Syedsma

+0

@syedsma正如我所說的:當.so卸載所有被它佔用的內存時,它就被釋放了。沒有其他辦法了。它是如何設計共享對象的。 –

+0

如何在dlclose調用時不要釋放數據段中的內存? – Syedsma

0

使用dlopen加載庫時使用RTLD_NODELETE標誌。當我們使用這個標誌時,全局靜態變量和全局靜態變量會在內存中持續存在。即使庫的引用計數變爲零。