फ़ाइल डिस्क्रिप्टर का जीवनकाल क्या है?


11

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

क्या आंतरिक विवरणक पूरी अवधि के लिए लिपि या शैल जीवनकाल के लिए बनाया गया है? क्या यह कुछ समय के बाद नष्ट हो जाता है, कई ऑपरेशन आदि?

मेरा मतलब है कि विशेष रूप से फाइल डिस्क्रिप्टर उन फ़ाइलों के लिए है जो शेल अपने बिलिन के संचालन के लिए खुलती है। क्या डिस्क्रिप्टर बनाया गया है और फ़ाइल प्रत्येक ऑपरेशन के लिए खोली गई है? उन्हें कब तक रखा जाता है? उदाहरण:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

क्या पहला डिस्क्रिप्टर उदाहरण दूसरे ऑपरेशन तक रखा गया है?

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

जवाबों:


4

संक्षेप में: कमांड पूरा होने के तुरंत बाद एक शेल लगभग निश्चित रूप से रीडायरेक्ट से संबंधित फाइल डिस्क्रिप्टर को बंद कर देगा।


विवरण: POSIX में पुनर्निर्देशन के माध्यम से खोली गई फ़ाइलों को बंद करने का कोई स्पष्ट उल्लेख नहीं है (जहां तक ​​मैं देख सकता हूं)। लेकिन उन्हें तुरंत बंद करना बहुत उपयोगी नहीं होगा।

नियम पर्यावरण के लिए किसी भी आदेशों में शुरू कर रहे हैं अतिरिक्त फ़ाइल वर्णनकर्ता पारित करने के लिए अनुमति नहीं है। शेल को किसी भी अतिरिक्त fd को बंद करने के लिए देखभाल करने की आवश्यकता होगी, यह एक कमांड शुरू करते समय बचाया जाता है जो उन्हें नहीं होना चाहिए।

सामान्य > filenameआउटपुट पुनर्निर्देशन के लिए, यदि फ़ाइल डिस्क्रिप्टर सहेजा गया था, तो भी प्रत्येक कमांड को शुरू करते समय फ़ाइल को अलग करना होगा। और किसी भी सहेजे गए फ़ाइल डिस्क्रिप्टर गलत फ़ाइल को इंगित करेगा यदि संबंधित फ़ाइल का नाम बदल दिया गया या इस बीच हटा दिया गया।

उदाहरण के लिए, यह सही ढंग से व्यवहार नहीं करेगा यदि पहले के लिए खोला गया fd खुला echoरखा गया था और दूसरे के लिए इस्तेमाल किया गया था:

echo foo >> x; mv x y; echo bar >> x

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


मेंawk , हालांकि, उत्पादन पुनर्निर्देशन के लिए वाक्य रचना खोल के समान है, लेकिन किसी भी खोली गई फ़ाइलों स्क्रिप्ट बाहर निकलता है जब तक खुला रखा जाता है, जब तक स्पष्ट बंद कर दिया। यह केवल fooएक बार खुलेगा , और इसे प्रिंट के बीच में नहीं काटेगा:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

समाप्त होने पर वे बंद हो जाते हैं। शेल प्रत्येक कमांड के लिए 3 फ़ाइल डिस्क्रिप्टर 0,1,2 बनाएगा जो इसे चलाता है। ये केवल संख्याएँ हैं, संख्याओं का पुन: उपयोग किया जाता है। शेल विवरणकों का फिर से उपयोग करने से पहले फ़ाइलों को बंद कर देगा।

फ़ाइल डिस्क्रिप्टर को अन्य प्रक्रियाओं में भी पास किया जाता है। और अगर आपके पास पृष्ठभूमि में एक प्रक्रिया है, तो इसमें अभी भी फ़ाइल विवरण होंगे।

उदाहरण का उपयोग करता है 3>&1, इसका मतलब है कि फाइल डिस्क्रिप्टर 3 उस फाइल को देखें जो डिस्क्रिप्टर 1 वर्तमान में संदर्भित करता है।

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