जब आप किसी फ़ाइल को ओवरराइट करते हैं तो क्या होता है?


26

मान लीजिए कि मैंने (बिल्ली) एक फाइल पढ़ी है जबकि एक अन्य प्रक्रिया इसकी सामग्री को फिर से लिख रही है। क्या आउटपुट प्रेडिक्टेबल है? क्या हुआ होगा?


3
व्यवहार अपरिभाषित है, आपको ऐसा कभी नहीं करना चाहिए।
डेसी

जवाबों:


19

यह इस बात पर निर्भर करता है कि लेखक क्या करता है।

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

यदि लेखक लिखना शुरू करने से पहले फ़ाइल को काट देता है, तो पाठक उस बिंदु पर फ़ाइल के अंत के खिलाफ चलेगा।

यदि लेखक एक नई फ़ाइल बनाता है तो नई फ़ाइल को पुराने नाम पर ले जाता है, पाठक पुरानी फ़ाइल से पढ़ता रहेगा। यदि एक खोली गई फ़ाइल को स्थानांतरित या हटा दिया जाता है, तो फ़ाइल को खोलने की प्रक्रियाएँ उसी फ़ाइल से पढ़ती रहती हैं। यदि फ़ाइल को हटा दिया जाता है, तो यह वास्तव में डिस्क पर रहता है (लेकिन इसे फिर से खोलने का कोई तरीका नहीं है) जब तक कि अंतिम प्रक्रिया ने इसे बंद नहीं किया है।

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


गाइल्स, क्या आपकी व्याख्या भी ftp/ sftpपरिदृश्यों में लागू होती है? कहते हैं कि एक प्रक्रिया एक संचरित ftpफ़ाइल को पढ़ना शुरू करती है जबकि एक ही फ़ाइल का दूसरा संस्करण एक नए प्रसारण के कारण इसे अधिलेखित कर देता है।
इरुवर

@ 1_CR हाँ। उस मामले में, लेखक और पाठक ftpd प्रक्रियाएं हैं।
गिल्स एसओ- बुराई को रोकना '

यहाँ ओवरटेक का मतलब क्या है?
विक्टर चॉय

@VictorChoy मानक अर्थ: किसी और के पीछे / उसके बाद शुरू करना और किसी बिंदु पर उनके आगे बढ़ना।
गिल्स एसओ- बुराई को रोकना '10

18

यह एक क्लासिक दौड़ की स्थिति है, इसलिए परिणाम परिभाषा से अप्रत्याशित है।

दूसरों के बीच, यह निर्भर करता है

  • fopen(3)या open(2)लिखने के तरीके,
  • कैसे / यदि लेखक इसके उत्पादन को बफ़र कर रहा है,
  • पाठक फ़ाइल को कैसे पढ़ रहा है,
  • पाठक और लेखक के बीच गति का अंतर,
  • समय पढ़ने और लेखक की शुरुआत के बीच अंतर।
  • और निश्चित रूप से, आधुनिक मल्टी-कोर मशीनों पर, चीजें अन्य कारकों द्वारा और भी अधिक जटिल हो जाती हैं (जैसे प्रक्रिया निर्धारण)।

यदि आपको फिर से लिखे जाने के दौरान किसी फ़ाइल को पढ़ने में सक्षम होना है, तो आप लेखक को फ़ाइल की एक क्षणिक प्रतिलिपि बना सकते हैं, इसे संशोधित कर सकते हैं, फिर इसे मूल फ़ाइल में वापस कॉपी कर सकते हैं। rsyncउदाहरण के लिए यह तरीका ऐसा करता है। इसे लागू करने के कई तरीके हैं, लेकिन कोई मुफ्त भोजन नहीं है। प्रत्येक विधि की अपनी कमियां और नतीजे हैं।


1
यह उत्तर मेरे मुकाबले कहीं अधिक व्यापक है। मेरा उत्तर हटा रहा है।
हत्यारे

0

पिछले उत्तरदाताओं की तुलना में अधिक व्यापक स्पष्टीकरण हैं, लेकिन यहां एक चाल है जो निश्चित रूप से अच्छी तरह से काम करती है, बहुत ज्यादा वही कर रही है जो वह चाहती है:

$ tail -f <filename>

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

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