मान लीजिए कि मैंने (बिल्ली) एक फाइल पढ़ी है जबकि एक अन्य प्रक्रिया इसकी सामग्री को फिर से लिख रही है। क्या आउटपुट प्रेडिक्टेबल है? क्या हुआ होगा?
मान लीजिए कि मैंने (बिल्ली) एक फाइल पढ़ी है जबकि एक अन्य प्रक्रिया इसकी सामग्री को फिर से लिख रही है। क्या आउटपुट प्रेडिक्टेबल है? क्या हुआ होगा?
जवाबों:
यह इस बात पर निर्भर करता है कि लेखक क्या करता है।
यदि लेखक मौजूदा फ़ाइल को अधिलेखित करता है, तो पाठक नई सामग्री को देखेगा जब लेखक पाठक को ओवरटेक करता है, यदि कभी भी। यदि लेखक और पाठक परिवर्तनशील गति से आगे बढ़ते हैं, तो पाठक वैकल्पिक रूप से पुरानी और नई सामग्री देख सकते हैं।
यदि लेखक लिखना शुरू करने से पहले फ़ाइल को काट देता है, तो पाठक उस बिंदु पर फ़ाइल के अंत के खिलाफ चलेगा।
यदि लेखक एक नई फ़ाइल बनाता है तो नई फ़ाइल को पुराने नाम पर ले जाता है, पाठक पुरानी फ़ाइल से पढ़ता रहेगा। यदि एक खोली गई फ़ाइल को स्थानांतरित या हटा दिया जाता है, तो फ़ाइल को खोलने की प्रक्रियाएँ उसी फ़ाइल से पढ़ती रहती हैं। यदि फ़ाइल को हटा दिया जाता है, तो यह वास्तव में डिस्क पर रहता है (लेकिन इसे फिर से खोलने का कोई तरीका नहीं है) जब तक कि अंतिम प्रक्रिया ने इसे बंद नहीं किया है।
यूनिक्स सिस्टम में अनिवार्य ताले नहीं होते हैं । यदि कोई अनुप्रयोग यह सुनिश्चित करना चाहता है कि उसके लेखक घटक और उसके पाठक घटक एक-दूसरे के पैर की उंगलियों पर न चलें, तो यह लॉकिंग का उपयोग करने के लिए डेवलपर पर निर्भर है। कुछ अपवाद हैं जहां कर्नेल द्वारा खोली गई एक फ़ाइल को उपयोगकर्ता अनुप्रयोगों द्वारा लिखने से बचाया जा सकता है, उदाहरण के लिए लूप -माउंटेड फ़ाइल सिस्टम छवि या एक निष्पादन योग्य जिसे कुछ यूनिक्स वेरिएंट पर निष्पादित किया जा रहा है।
ftp
/ sftp
परिदृश्यों में लागू होती है? कहते हैं कि एक प्रक्रिया एक संचरित ftp
फ़ाइल को पढ़ना शुरू करती है जबकि एक ही फ़ाइल का दूसरा संस्करण एक नए प्रसारण के कारण इसे अधिलेखित कर देता है।
यह एक क्लासिक दौड़ की स्थिति है, इसलिए परिणाम परिभाषा से अप्रत्याशित है।
दूसरों के बीच, यह निर्भर करता है
fopen(3)
या open(2)
लिखने के तरीके,यदि आपको फिर से लिखे जाने के दौरान किसी फ़ाइल को पढ़ने में सक्षम होना है, तो आप लेखक को फ़ाइल की एक क्षणिक प्रतिलिपि बना सकते हैं, इसे संशोधित कर सकते हैं, फिर इसे मूल फ़ाइल में वापस कॉपी कर सकते हैं। rsync
उदाहरण के लिए यह तरीका ऐसा करता है। इसे लागू करने के कई तरीके हैं, लेकिन कोई मुफ्त भोजन नहीं है। प्रत्येक विधि की अपनी कमियां और नतीजे हैं।
पिछले उत्तरदाताओं की तुलना में अधिक व्यापक स्पष्टीकरण हैं, लेकिन यहां एक चाल है जो निश्चित रूप से अच्छी तरह से काम करती है, बहुत ज्यादा वही कर रही है जो वह चाहती है:
$ tail -f <filename>
आपको फ़ाइल का अंत दिखाएगा जैसा कि लिखा जा रहा है। यदि आप किसी फ़ाइल में STDERR को पाइप करना चाहते हैं, लेकिन फिर भी इसे दूसरी टर्मिनल विंडो में देखें, उदाहरण के लिए।