जब प्रक्रिया से बाहर निकलते हैं तो विंडोज़ बंद सॉकेट का ख्याल रखता है?


12

मैंने लिनक्स के बारे में इस सवाल को पढ़ा है, क्या प्रक्रिया समाप्त होने पर पोर्ट को बाध्य किया जा सकता है?
बाहर निकलने और खुली कुर्सियां ​​छोड़ने के बाद लिनक्स साफ होने लगता है। मैं सोच रहा था कि विंडोज पर यह कैसे काम करता है इसके बारे में कोई विनिर्देश है। क्या ओएस लगातार उन प्रक्रियाओं के लिए कुर्सियां ​​बंद करने का ध्यान रखता है जो उन्हें बंद किए बिना बाहर निकलते हैं?

जवाबों:


10

विंडोज और यूनिक्स दोनों पर, जब एक प्रक्रिया कर्नेल से बाहर निकलती है तो सभी खुले हैंडल बंद हो जाते हैं।

Windows NT

एक प्रक्रिया को समाप्त करना - MSDN

किसी प्रक्रिया को समाप्त करने के निम्नलिखित परिणाम हैं:

  • [...]
  • प्रक्रिया द्वारा आवंटित किसी भी संसाधन को मुक्त कर दिया जाता है।
  • सभी कर्नेल ऑब्जेक्ट बंद हैं।
  • [...]

जबकि कर्नेल ऑब्जेक्ट के लिए खुले हैंडल स्वचालित रूप से बंद हो जाते हैं जब एक प्रक्रिया समाप्त हो जाती है, ऑब्जेक्ट स्वयं मौजूद होते हैं जब तक कि उनके लिए सभी खुले हैंडल बंद नहीं होते हैं। इसलिए, एक ऑब्जेक्ट एक प्रक्रिया के बाद वैध रहेगा जो इसका उपयोग कर रहा है यदि कोई अन्य प्रक्रिया इसके लिए एक खुला हैंडल है तो यह समाप्त हो जाती है।

ExitProcessसमारोह - MSDN

एक प्रक्रिया से बाहर निकलना निम्नलिखित का कारण बनता है:

  • [...]
  • प्रक्रिया द्वारा खोले गए सभी ऑब्जेक्ट हैंडल बंद हैं।
  • [...]

लिनक्स

exit(3) - लिनक्स प्रोग्रामर मैनुअल (libc फ़ंक्शन)

सभी खुली स्टैडियो (3) धाराएँ प्रवाहित और बंद होती हैं।

_exit(2) - लिनक्स प्रोग्रामर मैनुअल (कर्नेल syscalls)

फ़ंक्शन _exit()कॉलिंग प्रक्रिया को "तुरंत" समाप्त करता है। प्रक्रिया से संबंधित कोई भी खुला फ़ाइल विवरण बंद है; प्रक्रिया के किसी भी बच्चे को प्रक्रिया 1, init द्वारा विरासत में मिला है , और प्रक्रिया के माता-पिता को एक SIGCHLD संकेत भेजा जाता है।


ध्यान दें कि दोनों ऑपरेटिंग सिस्टम पर,

  1. सॉकेट्स केवल एक प्रकार के फ़ाइल डिस्क्रिप्टर (fd) / कर्नेल ऑब्जेक्ट हैं, इसलिए उपरोक्त फ़ाइलों और सॉकेट्स पर समान रूप से लागू होता है।

  2. यूनिक्स पर फ़ाइल विवरण, साथ ही ऑब्जेक्ट विंडोज पर कर्नेल ऑब्जेक्ट्स को संभालता है , कई प्रक्रियाओं के स्वामित्व में हो सकता है - वे अपने हैंडल को बाल प्रक्रियाओं द्वारा विरासत में प्राप्त कर सकते हैं और यहां तक ​​कि विशेष आईपीसी फ़ंक्शन का उपयोग करके पास किया गया है।

  3. एक फ़ाइल या सॉकेट तभी बंद होता है जब सभी fd की ओर इशारा करते हुए उसे नष्ट कर दिया जाता है।


2
टीसीपी सॉकेट एक विशेष मामला है, क्योंकि उनके TIME_WAIT राज्य हैं। उदाहरण के लिए, यदि आप एक टीसीपी पोर्ट पर सुनने वाले एप्लिकेशन को समाप्त करते हैं, तो आप अक्सर उसी पोर्ट पर तुरंत नहीं जा सकते।
हैमग

2
फ़ाइल डिस्क्रिप्टर और ऑब्जेक्ट हैंडल केवल एक प्रक्रिया के स्वामित्व और सुलभ हैं, और सख्ती से प्रति-प्रक्रिया निकाय हैं। यह फ़ाइल विवरण और अंतर्निहित ऑब्जेक्ट है जो प्रक्रियाओं के बीच साझा किए जाते हैं।
जेडीबीपी

5

विंडोज पर, एक सॉकेट एक संचार समापन बिंदु और एक प्रक्रिया के बीच एक कड़ी है। यही कारण है, जब आप एक सॉकेट की नकल करते हैं, तो आप दो सॉकेट के साथ हवा देते हैं लेकिन केवल एक समापन बिंदु। यही कारण है कि आप एक सॉकेट को दूसरी प्रक्रिया में एक नया सॉकेट बनाए बिना एक प्रक्रिया से दूसरी प्रक्रिया में पारित नहीं कर सकते।

यदि प्रक्रिया मौजूद नहीं है, तो इसके सॉकेट आवश्यक रूप से मौजूद हैं। इसे धारण करने की प्रक्रिया के बिना सॉकेट की कोई अवधारणा नहीं है। यही कारण है कि विंडोज कर्नेल ड्राइवर जो कर्नेल स्तर पर सॉकेट बनाना चाहते हैं, उन्हें सॉकेट के लिए एक प्रक्रिया निर्दिष्ट करनी चाहिए या फ़ंक्शन को उस प्रक्रिया संदर्भ से कॉल करना चाहिए जो सॉकेट का मालिक हो सकता है। (या वे सॉकेट्स का उपयोग किए बिना सीधे समापन बिंदुओं में हेरफेर कर सकते हैं।)

आपका प्रश्न वास्तव में सॉकेट्स के बारे में नहीं है, बल्कि संचार के बारे में है। सॉकेट में इसके संचार समापन बिंदु का संदर्भ होता है। जब सॉकेट चला जाता है, तो संदर्भ की गिनती गिर जाती है। यदि यह शून्य से टकराता है, तो इसे जल्द से जल्द हटा दिया जाएगा क्योंकि यह अनुमति दी जाती है कि संचार प्रोटोकॉल की आवश्यकताएं जो समापन बिंदु के साथ जुड़ी हुई हैं। टीसीपी में एक TIME_WAIT स्थिति है, जिसके दौरान किसी भी "बचे हुए" पैकेट को संभालने के लिए समापन बिंदु को चारों ओर रखा जाना चाहिए।


3

हाँ यह करता है। यह इस तरह से किया गया है अर्थ विंडोज़ 3.1 95 98 XP (कम से कम मुझे XP के बाद से पता है)।


1
नहीं, यह नहीं है। विंडोज एनटी संस्करण 3. 5 के बाद से , शायद। लेकिन डॉस-विंडोज विंडोज़ एनटी के लिए एक बहुत ही अलग जानवर था जब यह सॉकेट्स के लिए आया था; और डॉस-विंडोज 95 डॉस-विंडोज 3.1 से काफी अलग है, इसके अलावा। Win16 अनुप्रयोगों को कॉल करना आवश्यक था WSACleanup()अन्यथा लीक हुआ; और DOS-Windows 9x में एक बुरा समस्या थी, MSKB लेख # 156319 में प्रलेखित, माता-पिता प्रक्रियाओं को अपने बच्चों के लिए पारित सॉकेट को अमान्य करने के साथ, डॉस-विंडोज के कारण 'अलग-अलग प्रक्रिया निकास सॉकेट के लिए बाहर निकलें।
जेडीबीपी

1
@JdeBP: Windows NT 3. 1 के बारे में क्या - क्या इसने स्वचालित सफाई की?
user1686

1
3.1 में पहली बार सॉकेट नहीं थे।
JdeBP

... अच्छी बात है, @ जेडेबीपी - मैंने ऐसा नहीं सोचा था।
user1686

@JdeBP इसे सही करने के लिए अद्यतित उत्तर।
स्कॉट चैंबरलेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.