2013-03-01 7 views
11

मैं लिनक्स एपीआई sem_unlink() द्वारा थोड़ा उलझन में हूं, मुख्य रूप से कब या इसे कॉल क्यों करें। मैंने विंडोज़ में कई सालों से सैमफोर का इस्तेमाल किया है। एक बार जब आप नामित सेमफोर के अंतिम हैंडल को बंद कर देते हैं तो सिस्टम अंतर्निहित कर्नेल ऑब्जेक्ट को हटा देता है। लेकिन यह आपके लिनक्स में दिखाई देता है, डेवलपर को sem_unlink() को कॉल करके कर्नेल ऑब्जेक्ट को हटाने की आवश्यकता है। यदि आप कर्नेल ऑब्जेक्ट/dev/shm फ़ोल्डर में नहीं रहते हैं।sem_unlink() को कब कॉल करें?

समस्या मैं चल रहा हूं, अगर प्रक्रिया ए कॉल sem_unlink() प्रक्रिया बी बी को सेमाफोर लॉक किया गया है, तो यह तुरंत सेमफोर को नष्ट कर देता है और अब प्रक्रिया बी को सेमफोर द्वारा "संरक्षित" नहीं किया जाता है जब प्रक्रिया सी साथ आता है। और भी, मैन पेज सबसे अच्छा भ्रमित कर रहा है:

"सेमफोर नाम तुरंत हटा दिया जाता है। सेमफोर को अन्य सभी प्रक्रियाओं में नष्ट कर दिया जाता है, जिसमें सेमफोर इसे बंद कर देता है।"

अगर ऑब्जेक्ट को सैमफोर बंद करने के लिए अन्य प्रक्रियाओं का इंतजार करना पड़ता है तो यह तुरंत वस्तु को कैसे नष्ट कर सकता है?

स्पष्ट रूप से मैं लिनक्स पर सेमफोर ऑब्जेक्ट्स के उचित उपयोग को समझ नहीं पा रहा हूं। किसी भी मदद के लिए धन्यवाद। नीचे कुछ नमूना कोड है जिसका मैं परीक्षण करने के लिए उपयोग कर रहा हूं। अपने प्रश्नों के

int main(void) 
{ 
    sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1); 
    if(pSemaphore != SEM_FAILED) 
    { 
     if(sem_wait(pSemaphore) == 0) 
     { 
      // Perform "protected" operations here 

      sem_post(pSemaphore); 
     } 

     sem_close(pSemaphore); 
     sem_unlink("/MyName"); 
    } 

    return 0; 
} 
+1

मुझे लगता है कि आप मैन्युअल पृष्ठ को गलत पढ़ रहे हैं। "सेमफोर नाम तुरंत हटा दिया जाता है" का अर्थ शाब्दिक रूप से यह कहता है - नाम हटा दिया गया है ताकि कोई और प्रक्रिया उस नाम से सेमफोर तक पहुंच न सके। यह इस बात का तात्पर्य नहीं है कि सेमफोर हटा दिया गया है, बस नाम।दूसरी वाक्य में बताया गया है कि सेमफोर हटा दिया गया है - वर्तमान में इसे खोलने वाली प्रत्येक प्रक्रिया के बाद इसे – twalberg

+0

बंद कर दिया गया है, तो मुझे लगता है कि प्रश्न बन जाता है, आप किस बिंदु पर सेमफोर को हटाने के लिए sem_unlink() को कॉल करते हैं? यह सुनिश्चित करने का एकमात्र तरीका यह है कि यह काम सही ढंग से सिस्टम पर सैफफोर को अनिश्चित काल से छोड़ना है। यह मैला प्रोग्रामिंग की तरह लगता है, लेकिन मुझे एक और समाधान नहीं दिख रहा है। – user2124642

+1

मुझे लगता है कि विचार यह है कि आप इसे तय करते हैं कि आप जो भी बिंदु तय करते हैं, अब आप नई प्रक्रियाओं को संलग्न करने में सक्षम नहीं होना चाहते हैं। सिस्टम उन प्रक्रियाओं को अनुमति देता है जो पहले से ही ऑपरेटिंग जारी रखने के लिए जुड़े हुए हैं, केवल वर्तमान में सक्रिय उपयोगकर्ता दूर जाने पर संसाधनों को इकट्ठा करने का कचरा। मैं यह तय करने वाला नहीं हूं कि यह "मैला" है या नहीं, लेकिन ध्यान रखें, यह एक पुराना इंटरफ़ेस/एपीआई है, इसलिए यह आज के मानकों से "आदर्श" नहीं हो सकता है, लेकिन यह अभी भी इसके लिए काम करता है के लिए डिजाइन किया गया है, और इस प्रकार उपयोगी है। – twalberg

उत्तर

7

प्रतिक्रिया:

  1. खिड़कियों आपके द्वारा बताई गई के लिए सेमाफोर व्यवहार की तुलना में, POSIX संकेतबाहु कर्नेल लगातार कर रहे हैं। इसका अर्थ यह है कि सेमफोर इसके मूल्य को बरकरार रखता है भले ही कोई प्रक्रिया सेमफोर खोला न जाए। (सेमाफोर के संदर्भ गिनती 0 होगा)

  2. प्रक्रिया एक sem_unlink कॉल करता है(), जबकि प्रक्रिया बी सेमाफोर बंद कर दिया है। इसका अर्थ है कि सेमफोर की संदर्भ संख्या 0 नहीं है और नष्ट नहीं होगी।

sem_close sem_unlink बनाम की बुनियादी आपरेशन, मैं समग्र समझ में मदद मिलेगी लगता है:

sem_close: पास, एक सेमाफोर है यह भी किया है जब एक प्रक्रिया से बाहर निकलता है। semaphore अभी भी प्रणाली में बनी हुई है।

sem_unlink: केवल सिस्टम से हटा दिया जाएगा जब संदर्भ गणना 0 तक पहुंच जाती है (जो सभी प्रक्रियाओं के बाद होती है, sem_close को कॉल करें या बाहर निकलें)।

संदर्भ: बुक - यूनिक्स नेटवर्किंग प्रोग्रामिंग-Interprocess संचार W.Richard स्टीवंस, खंड 2, ch10

+0

इस नाम के लिए 'sem_unlink' (लेकिन' sem_close' नहीं कहा जाता है) के बाद से किसी अन्य प्रक्रिया में सेमफोर 'sem_open' संभव है, या यह नया कर्नेल ऑब्जेक्ट बनायेगा? – SBKarr

+0

@ एसबीकेएआर यह एक नया कर्नेल ऑब्जेक्ट बनाता है। –

3

sem_unlink() समारोह से सेमाफोर नाम और निशान सेमाफोर द्वारा की पहचान को हटा एक बार सभी नष्ट हो प्रक्रियाओं का उपयोग करना बंद कर देता है (इसका मतलब हो सकता है, अगर सेमेफोर के सभी प्रक्रियाओं को पहले से ही बंद कर दिया गया है)।

+0

अच्छा, मैं इसके बारे में सोच रहा था। मैन पेज स्पष्ट रूप से बताता है कि क्या होता है यदि sem_unlink कहलाता है तो एक सेमफोर पहले ही बंद हो जाता है। दिलचस्प बात यह है कि इसका मतलब है कि क्लीन-अप थ्रेड sem_close या तो sem_unlink कर सकता है, या sem_unlink तो sem_close कर सकता है। – Urhixidur

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