2012-08-27 9 views
5

यदि मैं एक ही आवेदन/रन में दो बार एक ही lib/फ़ाइल पर 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-परेशान सामग्री को परेशान नहीं करना संभव है।

जोड़ा गया (जब तक अपने dlopen एड साझा पुस्तकालयों अजीब या संसाधन लेने वाली निर्माता या नाशक कार्यों) दिसंबर 2017 में:

सटीक पथ स्ट्रिंग पारित कर सूचना है कि क्या प्रासंगिक है है dlopen पर। तो यदि आप "./foo.so" और "././foo.so" (या "../foosymlink.so" जहां foosymlink.sofoo.so पर एक सिम्लिंक है) dlopen-ed हैंडल अलग हैं, और कुछ मामलों में उस साझा लाइब्रेरी के दो उदाहरणों का अजीब व्यवहार हो सकता है।

+1

.. और मैंने अभी इस मैन पेज को पढ़ा है, मैंने इस पैराग्राफ को भी क्यों नहीं पढ़ा? Hmpf .. अच्छा, मेरे बेवकूफ सवाल का जवाब देने के लिए कोई भी कम धन्यवाद :) – mageta

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^