फ़ाइल विवरणक और कांटा


15

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

जब एक प्रक्रिया closeफ़ाइल डिस्क्रिप्टर के माध्यम से एक विशेष खुली फ़ाइल को बंद करने के लिए फ़ंक्शन को कॉल करती है । प्रक्रिया की फ़ाइल तालिका में, संदर्भ गणना एक से घट जाती है। लेकिन चूंकि माता-पिता और बच्चे दोनों एक ही फाइल को धारण कर रहे हैं, संदर्भ संख्या 2 है और बंद होने के बाद यह घटकर 1. हो जाती है क्योंकि यह शून्य नहीं है प्रक्रिया अभी भी बिना किसी समस्या के फ़ाइल का उपयोग करना जारी रखती है।

टेरेंस चैन UNIX सिस्टम प्रोग्रामिंग, (फाइल के लिए यूनिक्स कर्नेल सपोर्ट) देखें।


ठीक है, कभी भी अंतिम टिप्पणी पर ध्यान न दें;) के लिए पुरुष पृष्ठों में open()और fork()एक फाइल डिस्क्रिप्ट-या एक फ़ाइल डिसिप्लेंट-आयन के बीच एक अंतर है - पूर्व बाद में संदर्भित करता है, और यद्यपि एक कांटे में वर्णनकर्ता प्रतियां हैं, वे उसी विवरण का संदर्भ देते हैं। हालांकि, जब परीक्षण किया जाता है तो यह स्पष्ट है कि इसका मतलब यह नहीं है कि बच्चे के हैंडल को बंद करना माता-पिता के हैंडल को बंद कर देता है। मुझे लगता है कि जब दोनों हैंडल लिखते हैं, तो यह डेटा की इंटरलाकिंग के लिए एक सूक्ष्म अंतर हो सकता है - लेकिन यह वैसे भी अनिश्चित है, इसलिए वास्तव में ऐसा कैसे होता है यह इतना महत्वपूर्ण नहीं है।
1444

जवाबों:


29

जब एक बच्चे को कांटा जाता है, तो उसे माता-पिता की फाइल डिस्क्रिप्टर विरासत में मिलती है, अगर बच्चा फाइल डिस्क्रिप्टर बंद कर देता है तो क्या होगा?

यह फाइल डिस्क्रिप्टर की एक कॉपी विरासत में मिलती है । इसलिए बच्चे में विवरणकर्ता को बंद करना बच्चे के लिए इसे बंद कर देगा, लेकिन माता-पिता को नहीं, और इसके विपरीत।

यदि बच्चा लिखना शुरू कर देता है, तो माता-पिता के अंत में फ़ाइल का क्या होगा? इन विसंगतियों, गिरी या उपयोगकर्ता का प्रबंधन कौन करता है?

यह बिल्कुल (जैसा कि, वास्तव में) एक ही प्रक्रिया एक ही फ़ाइल में लिखने के समान है। कर्नेल स्वतंत्र रूप से प्रक्रियाओं को शेड्यूल करता है, इसलिए आपको फ़ाइल में इंटरलेयड डेटा प्राप्त होने की संभावना होगी।

हालांकि, POSIX (जो करने के लिए * nix सिस्टम काफी हद तक या पूरी तरह से अनुरूप), उल्लेख है कि read()और write()सी एपीआई (जो सिस्टम कॉल करने के लिए नक्शे) के संबंध में परमाणु रहे हैं "से कार्य एक दूसरे [...] वे नियमित रूप से फ़ाइलों पर कार्य करते हैं जब या प्रतीकात्मक लिंक ”। जीएनयू सी मैन्युअल रूप से पाइप के संबंध में भी अनंतिम रूप से वादा करता है (ध्यान दें कि डिफ़ॉल्ट PIPE_BUF, जो प्रोविज़ो का हिस्सा है, 64 kiB है)। इसका मतलब यह है कि अन्य भाषाओं / उपकरणों में कॉल, जैसे कि का उपयोग, echoया catउस अनुबंध में शामिल किया जाना चाहिए, इसलिए यदि दो अनिर्दिष्ट प्रक्रिया "हेल्लो" और "दुनिया" को एक साथ एक ही पाइप में लिखने की कोशिश करती है, तो दूसरे क्या निकलेगा अंत या तो "हेलोवर्ल्ड" या "वर्ल्डहेलो" है, और कभी कुछ ऐसा नहीं है "

जब एक प्रक्रिया कॉल फ़ंक्शन को फ़ाइल डिस्क्रिप्टर के माध्यम से किसी विशेष खुली फ़ाइल को बंद करने के लिए बुलाती है। प्रक्रिया की फ़ाइल तालिका एक से संदर्भ संख्या को घटाती है। लेकिन चूंकि माता-पिता और बच्चे दोनों एक ही फाइल को पकड़े हुए हैं (वहाँ पर गिनती की संख्या 2 है और बंद होने के बाद यह कम हो जाती है 1) चूंकि यह शून्य नहीं है, इसलिए प्रक्रिया अभी भी बिना किसी समस्या के फ़ाइल का उपयोग करना जारी रखती है।

दो प्रक्रियाएं हैं, माता-पिता और बच्चे। दोनों के लिए कोई "संदर्भ गणना" सामान्य नहीं है। वे स्वतंत्र हैं। WRT तब होता है जब उनमें से कोई एक फाइल डिस्क्रिप्टर को बंद कर देता है, पहले प्रश्न का उत्तर देखें।


1

जब भी fork()कोई नया बच्चा बनाता है, तो फाइल डिस्क्रिप्टर को बिल्कुल भी बरकरार नहीं रखा जाता है - उन्हें बदल दिया जाता है।

हालाँकि फ़ाइल एक डुप्लिकेट होगी, इसमें एक अलग फ़ाइल डिस्क्रिप्टर होगा।

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