2016-01-19 5 views
7

मेरे पास एक सर्वर एप्लिकेशन है जो एक विशिष्ट पथ में एक यूनिक्स डोमेन सॉकेट बनाता है जिसमें नाम और bind() एस है।जब मैं अपने आवेदन से बाहर निकलता हूं तो मैं यूनिक्स डोमेन सॉकेट फ़ाइल को कैसे हटा सकता हूं?

मुझे केवल सॉकेट को हटाने की आवश्यकता है जब मैं एप्लिकेशन कोड के भीतर से जानबूझकर एप्लिकेशन को बंद/बंद कर देता हूं; अन्यथा इसे खोलने की जरूरत है। मैं यह कैसे करु?

धन्यवाद!

संपादित करें: मान लें कि मैं अपना आवेदन टर्मिनल के अंदर से शुरू और चलाता हूं।

उत्तर

11

आप इसे जितना कठिन होना चाहते हैं उससे अधिक कठिन बना रहे हैं। unlink()bind() से ठीक पहले रखें। इस तरह हर कोई यह करता है। (उदाहरण: BSD syslogd, क्लासिक यूनिक्स-डोमेन-सॉकेट-आधारित सेवाओं में से एक)

+0

धन्यवाद। मैंने सोचा कि मुझे बांधने के बाद जाना है। यह निर्दिष्ट करने के लिए धन्यवाद कि इसे पहले जाना था। – Pheonix7

+0

जब भी सर्वर नहीं चल रहा है, तो निर्देशिका सूची में स्टाइल सॉकेट को दिखाने से रोकने के लिए आप अभी भी बाहर निकलने पर अनलिंक कर सकते हैं। लेकिन यह पूरी तरह से कॉस्मेटिक है। –

1

बस

unlink("Path/to/Socket"); 

पर अमल करने से पहले आप अपने कार्यक्रम से बाहर निकलें।

+0

लेकिन मैं टर्मिनल से अपने आवेदन से बाहर निकलता हूं, तो मैं कोड में अनलिंक कहां रखूंगा? – Pheonix7

0

आप एक साधारण के साथ सॉकेट फ़ाइल निकाल सकते हैं:

unlink(path); 

आप कहीं भी अपने कार्यक्रम से बाहर निकलें, तो देखें कि यह मौजूद है, और इसे हटाने के कार्यक्रम।

+0

लेकिन मैं टर्मिनल से अपने आवेदन से बाहर निकलता हूं, तो मैं कोड में अनलिंक कहां रखूंगा? – Pheonix7

+0

इससे कोई फर्क नहीं पड़ता कि आप कहां से अपने आवेदन से बाहर निकलें, जब तक कि आप यह कह रहे हों कि आप 'नियंत्रण-सी' या कुछ मार रहे हैं। उस स्थिति में, आपको सिग्नल हैंडलर बनाना होगा जो बाहर निकलने से पहले सॉकेट का ख्याल रखे। –

2

यदि आपके पास अपने एप्लिकेशन से एकाधिक निकास बिंदु हैं और आप उनमें से प्रत्येक को क्लीनअप दिनचर्या कॉल करने के लिए संशोधित नहीं करना चाहते हैं, तो आप "गंदे" दृष्टिकोण का उपयोग कर सकते हैं।

जब सॉकेट अभी बनाया गया है, तो atexit(3) के साथ क्लीनअप दिनचर्या पंजीकृत करें। नियमित (जो कि unlink(2) पर कॉल है) को सामान्य रूप से समाप्त होने पर कॉल किया जाएगा। लेकिन अगर संकेत सिग्नल के साथ समाप्त हो जाता है तो इसे नहीं कहा जाएगा। इसलिए, यदि आप SIGINT और इसी तरह के सिग्नल प्राप्त करने के बाद सफाई करना चाहते हैं, तो आपको सिग्नल हैंडलर को ठीक से सेट करने की भी आवश्यकता है।

+0

ठीक है, लेकिन फ़ाइल अभी भी remais वहाँ है। मुझे फ़ोल्डर – Pheonix7

+0

@ फेनिक्स 7 से फ़ाइल को हटाने की भी आवश्यकता है, क्या आपने त्रुटियों के लिए अनलिंक के निकास कोड को चेक किया है? – gudok

+0

जब मैं ctr + c के साथ अनुप्रयोग से बाहर निकलता हूं तो टर्मिनल कुछ भी नहीं कहता है। जब मैं एप्लिकेशन को पुनरारंभ करता हूं तो मुझे एक बाध्य त्रुटि मिलती है: उपयोग में पता – Pheonix7

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

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