2012-08-06 25 views
10

मेरे पास यह निम्नलिखित परिदृश्य है।क्या हमें स्पष्ट रूप से एक पाइप के पढ़ने के अंत को बंद करने की आवश्यकता है जिसका लेखन अंत पहले ही बंद कर दिया गया है?

  1. मैं एक पाइप बना देता हूं।

  2. एक बच्चे की प्रक्रिया को फोर्क किया गया।

  3. बाल पाइप स्पष्ट के अंत पढ़ सकते हैं और बंद करने के लिए कुछ भी बिना पाइप और बाहर निकलता है के अंत लिखने में लिखते हैं बंद कर देता है (निकास बच्चे की ओर से सभी खुले फ़ाइल/पाइप वर्णनकर्ता बंद हो जाना चाहिए, मुझे लगता है)।

  4. जनक पाइप स्पष्ट के अंत लिखने बंद कर देता है और पाइप fgetsfgets जब तक रिटर्न शून्य का उपयोग करने का पढ़ा छोर से पढ़ता है। यानी यह पूरी तरह से पढ़ता है।

अब मेरा सवाल यह है कि माता-पिता को पढ़ने के बाद स्पष्ट रूप से पाइप के पढ़ने के अंत को बंद करने की आवश्यकता क्यों होती है? एक बार पूरा डेटा पढ़ने के अंत से पढ़ा गया है, तो पूरी तरह से पाइप को हटाने के लिए सिस्टम के लिए बुद्धिमान नहीं है?

मैं स्पष्ट रूप से अभिभावक में पढ़ने के अंत को बंद कर देता हूं और मेरे पास Too many file descriptors अधिक पाइप खोलने के दौरान जल्दी या बाद में त्रुटि है। मेरी धारणा यह थी कि सिस्टम लिखने के अंत बंद होने के बाद सिस्टम स्वचालित रूप से एक पाइप हटा देता है और डेटा को पढ़ने के अंत से पूरी तरह से पढ़ा जाता है। क्या आप एक पाइप से दो बार नहीं कर सकते!

तो, डेटा को पूरी तरह से पढ़े जाने और अंत बंद लिखने के बाद सिस्टम को पाइप को हटाने से सिस्टम के पीछे क्या तर्क है?

+0

"क्या आप दो बार एक पाइप से नहीं कर सकते हैं!" ??? –

+0

@KerrekSB मेरा मतलब था कि आप एक ही पाइप को दो बार पढ़ सकते हैं लेकिन दूसरी बार ईओएफ देखेंगे? –

उत्तर

7

आप सही हैं कि बच्चे बाहर निकलने के बाद पाइप के लिखने के अंत को बंद कर देगा। हालांकि, उस पाइप के एक और लिखने का अंत हो सकता है, अगर बच्चा fork एस या अन्य प्रक्रिया में लिखने के अंत का डुप्लिकेट पास करता है।

यह अभी भी सच है कि सिस्टम यह बताने में सक्षम होगा कि पाइप के एक छोर पर सभी वर्णक बंद हो गए हैं (या तो स्पष्ट रूप से या क्योंकि स्वामित्व प्रक्रिया समाप्त हो गई है)। यह अभी भी पाइप के दूसरे छोर पर बंद करने के लिए समझ में नहीं आता है, क्योंकि जब पैरेंट प्रक्रिया पाइप के अंत में वर्णक को बंद करने की कोशिश करती है तो इससे भ्रम पैदा होता है; या तो:

  • एफडी सिस्टम द्वारा बंद कर दिया गया है, इस मामले में एक त्रुटि है क्योंकि यह पहले से ही बंद एफडी बंद करने का प्रयास करता है; या
  • एफडी का पुन: उपयोग किया गया है, जो अब भी बदतर है क्योंकि यह अब पूरी तरह से असंबंधित एफडी बंद कर रहा है।

प्रणाली की दृष्टि से, यह अच्छी तरह से, पाइप एक बार सभी एक छोर पर वर्णनकर्ता बंद कर दिए गए खारिज हो सकता है तो आप वहाँ अक्षमता के बारे में चिंता करने की जरूरत नहीं है। इससे अधिक मायने रखता है कि उपयोगकर्ता अंतरिक्ष प्रक्रिया में एक सतत अनुभव होना चाहिए, जिसका अर्थ यह है कि जब तक यह विशेष रूप से अनुरोध नहीं किया जाता है तब तक वर्णक को बंद नहीं करना चाहिए।

5

फ़ाइल डिस्क्रिप्टर सिस्टम द्वारा बंद नहीं होते हैं, प्रक्रिया समाप्त होने तक। यह पाइप, साथ ही साथ किसी भी अन्य फ़ाइल वर्णनकर्ता के लिए सच है।

पाइप (या किसी अन्य फ़ाइल) के बीच कोई बड़ा अंतर नहीं है जिसमें कोई डेटा नहीं है और एक बंद फ़ाइल डिस्क्रिप्टर है।
जब कोई फ़ाइल डिस्क्रिप्टर बंद होता है, तो सिस्टम एक नई फ़ाइल डिस्क्रिप्टर के लिए अपना नंबर पुन: उपयोग कर सकता है। फिर, जब आप पढ़ते हैं, तो आपको कुछ और मिलता है। तो एक फ़ाइल डिस्क्रिप्टर बंद करने के बाद, अब आप इसका उपयोग नहीं करना चाहिए।

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