मैं लिनक्स के लिए यूनिक्स डोमेन सॉकेट सर्वर लिख रहा हूं।कैसे पता चलेगा कि कोई प्रक्रिया यूनिक्स डोमेन सॉकेट से जुड़ी है या नहीं?
यूनिक्स डोमेन सॉकेट की एक विशिष्टता मुझे जल्दी से पता चला कि, एक सुनवाई यूनिक्स सॉकेट बनाने के दौरान मेल खाने वाली फाइल सिस्टम प्रविष्टि बनाता है, सॉकेट बंद करना इसे हटा नहीं देता है। इसके अलावा, जब तक फाइल सिस्टम प्रविष्टि मैन्युअल रूप से हटा दी जाती है, तब तक bind()
एक ही पथ पर एक सॉकेट को फिर से संभव नहीं है: bind()
EADDRINUSE
के साथ विफल रहता है यदि यह पथ फ़ाइल सिस्टम में पहले से मौजूद है।
परिणामस्वरूप, सर्वर पुनरारंभ पर EADDRINUSE
प्राप्त करने से बचने के लिए सॉकेट की फाइल सिस्टम प्रविष्टि unlink()
'सर्वर शटडाउन पर एड होना आवश्यक है। हालांकि, यह हमेशा नहीं किया जा सकता है (यानी सर्वर सर्वर दुर्घटना)। अधिकतर अक्सर पूछे जाने वाले प्रश्न, फोरम पोस्ट, क्यू & bind()
पर कॉल करने से पहले unlink()
सॉकेट के लिए एक कार्यवाही के रूप में, मुझे केवल एक वेबसाइट के रूप में सलाह दी गई है। हालांकि, इस मामले में, यह जानना वांछनीय हो जाता है कि unlink()
से पहले यह प्रक्रिया इस सॉकेट से जुड़ी है या नहीं।
दरअसल, unlink()
'एक यूनिक्स सॉकेट में है, जबकि एक प्रक्रिया अभी भी बाध्य है और फिर सुनवाई सॉकेट को फिर से बनाना कोई त्रुटि नहीं उठाता है। नतीजतन, हालांकि, पुरानी सर्वर प्रक्रिया अभी भी चल रही है लेकिन पहुंच योग्य नहीं है: पुराने सुनवाई सॉकेट को नए द्वारा "मुखौटा" किया जाता है। इस व्यवहार से बचा जाना चाहिए।
आदर्श रूप में, यूनिक्स डोमेन सॉकेट का उपयोग कर, सॉकेट एपीआई एक ही "पारस्परिक अपवर्जन" व्यवहार है कि सामने आ रहा है जब बंधन TCP या UDP सॉकेट अवगत कराया जाना चाहिए था: "मैं सॉकेट एस बाध्य करने के लिए एक समाधान करने के लिए चाहते हैं, अगर एक प्रक्रिया है पहले से ही इस पते से जुड़ा हुआ है, बस शिकायत करें! "दुर्भाग्यवश यह मामला नहीं है ...
क्या इस" आपसी बहिष्करण "व्यवहार को लागू करने का कोई तरीका है? या, एक फाइल सिस्टम पथ दिया गया है, सॉकेट एपीआई के माध्यम से जानने का कोई तरीका है, क्या सिस्टम पर किसी भी प्रक्रिया में यूनिक्स डोमेन सॉकेट इस पथ से बंधी है? क्या मुझे सॉकेट एपीआई (flock()
, ...) के बाहर आदिम सिंक्रनाइज़ेशन का उपयोग करना चाहिए? या क्या मैं कुछ न कुछ भूल रहा हूं ?
आपके सुझावों के लिए धन्यवाद।
नोट: लिनक्स के अमूर्त नामस्थान यूनिक्स सॉकेट इस समस्या को हल करने लगते हैं, क्योंकि unlink()
पर कोई फ़ाइल सिस्टम प्रविष्टि नहीं है। हालांकि, जो सर्वर मैं लिख रहा हूं वह सामान्य होना है: यह यूनिक्स डोमेन सॉकेट दोनों प्रकार के खिलाफ मजबूत होना चाहिए, क्योंकि मैं सुनने के पते चुनने के लिए ज़िम्मेदार नहीं हूं।
आपके उत्तर के लिए धन्यवाद। पारंपरिक लॉकफाइल सिस्टम का उपयोग करना स्वीकार्य रूप से जाने का सबसे सुरक्षित तरीका है। साथ ही, एक सेवा खोज प्रणाली अधिक है या नहीं: विडंबना यह है कि, इस सर्वर को स्वयं सेवा सेवा प्रणाली का हिस्सा बनने की योजना है (सेवा "पंजीकरण" प्रणाली अधिक उचित लगती है)। यह आपके प्रश्न का उत्तर देना चाहिए ;-) –