2012-08-27 4 views
5

Jeśli używam dlopen w tej samej bibliotece/pliku dwa razy w tym samym uruchomieniu aplikacji, czy w obu przypadkach uzyska on ten sam uchwyt? Czy jest na to jakakolwiek gwarancja (krótki eksperyment pokazał, że przynajmniej działa na moim komputerze)?Czy dlopen przyniesie taki sam uchwyt dla dwóch połączeń z tym samym plikiem?

Obecnie gram z małym systemem wtyczek (z ciekawości) i gdyby istniała jakaś gwarancja tego obserwowanego zachowania, mógłbym użyć tego adresu jako klucza do wtyczki, aby zapobiec powielonym ładunkom.

Odpowiedz

8

Tak. Strona man dlopen(3) linux mówi:

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, na systemach Linux, można dlopen dużo (wielu dziesiątek tysięcy) bibliotek współdzielonych, jak moim przykładzie manydl.c demonstruje. Głównym ograniczeniem jest przestrzeń adresowa. Praktycznie więc, nie przejmując się, dlclose -ing rzeczy jest możliwe.

(chyba biblioteki Twój dlopen-ed dzielone mają dziwne lub zużywa zasobów konstruktora lub spalające funkcji)

dodana w grudniu 2017:

Zauważ, że to, co jest istotne jest ciąg dokładna ścieżka przeszła do dlopen. Więc jeśli używasz "./foo.so" i (lub gdzie foosymlink.so jest dowiązaniem symbolicznym do foo.so), dlopen-ed uchwyty są różne, aw niektórych przypadkach może zachodzić dziwne zachowanie dwóch wystąpień tej współużytkowanej biblioteki.

+1

.. i właśnie przeczytałem tę stronę podręcznika, dlaczego nie przeczytałem również tego akapitu? Hmpf .. cóż, dziękuję jednak za odpowiedź na moje głupie pytanie :) – mageta