मैं लिनक्स एपीआई 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;
}
मुझे लगता है कि आप मैन्युअल पृष्ठ को गलत पढ़ रहे हैं। "सेमफोर नाम तुरंत हटा दिया जाता है" का अर्थ शाब्दिक रूप से यह कहता है - नाम हटा दिया गया है ताकि कोई और प्रक्रिया उस नाम से सेमफोर तक पहुंच न सके। यह इस बात का तात्पर्य नहीं है कि सेमफोर हटा दिया गया है, बस नाम।दूसरी वाक्य में बताया गया है कि सेमफोर हटा दिया गया है - वर्तमान में इसे खोलने वाली प्रत्येक प्रक्रिया के बाद इसे – twalberg
बंद कर दिया गया है, तो मुझे लगता है कि प्रश्न बन जाता है, आप किस बिंदु पर सेमफोर को हटाने के लिए sem_unlink() को कॉल करते हैं? यह सुनिश्चित करने का एकमात्र तरीका यह है कि यह काम सही ढंग से सिस्टम पर सैफफोर को अनिश्चित काल से छोड़ना है। यह मैला प्रोग्रामिंग की तरह लगता है, लेकिन मुझे एक और समाधान नहीं दिख रहा है। – user2124642
मुझे लगता है कि विचार यह है कि आप इसे तय करते हैं कि आप जो भी बिंदु तय करते हैं, अब आप नई प्रक्रियाओं को संलग्न करने में सक्षम नहीं होना चाहते हैं। सिस्टम उन प्रक्रियाओं को अनुमति देता है जो पहले से ही ऑपरेटिंग जारी रखने के लिए जुड़े हुए हैं, केवल वर्तमान में सक्रिय उपयोगकर्ता दूर जाने पर संसाधनों को इकट्ठा करने का कचरा। मैं यह तय करने वाला नहीं हूं कि यह "मैला" है या नहीं, लेकिन ध्यान रखें, यह एक पुराना इंटरफ़ेस/एपीआई है, इसलिए यह आज के मानकों से "आदर्श" नहीं हो सकता है, लेकिन यह अभी भी इसके लिए काम करता है के लिए डिजाइन किया गया है, और इस प्रकार उपयोगी है। – twalberg