2012-08-27 69 views
5

如果我在相同的應用程序運行中對同一個lib /文件使用dlopen兩次,它會在這兩種情況下產生相同的句柄嗎?有沒有這方面的保證(一個簡短的實驗表明它至少在我的盒子上)?對於具有相同文件的兩個調用,dlopen會產生相同的句柄嗎?

我目前正在玩一個小插件系統(出於好奇),如果有這種觀察到的行爲會有某種保證,我可以使用此地址作爲插件的關鍵,以防止重複的負載。

回答

8

是的。該dlopen(3) Linux手冊頁說:

If the same library is loaded again with dlopen(), the same file 
    handle is returned. The dl library maintains reference counts for 
    library handles, so a dynamic library is not deallocated until 
    dlclose() has been called on it as many times as dlopen() 
    has succeeded on it. 

BTW,在Linux系統中,你可以dlopen的共享庫的很多(許多幾十千),作爲我的例子manydl.c演示。主要限制是地址空間。 所以幾乎沒有打擾dlclose -ing的東西是可能的。

(除非你的dlopen-ED共享庫有奇怪的或消耗資源的構造函數和析構函數的函數)

加在2017年12月:

注意的是相關的確切路徑字符串傳遞到dlopen。因此,如果使用"./foo.so""././foo.so"(或"../foosymlink.so"其中foosymlink.so是符號鏈接foo.so),則dlopen-ed句柄是不同的,並且在某些情況下,可能會發生該共享庫的兩個實例的奇怪行爲。

+1

..我剛剛閱讀了這個手冊頁,爲什麼我沒有閱讀這個段落呢? Hmpf ..好吧,謝謝你回答我的愚蠢問題:) – mageta

相關問題