लिनक्स सिस्टम पर खुली फाइलें कैसे व्यवहार करती हैं?


17

मैंने बस "foo.log.old" के लिए एक लॉग फ़ाइल का नाम बदला, और यह मान लिया कि एप्लिकेशन "foo.log" पर एक नया लॉगफ़ाइल लिखना शुरू कर देगा। मुझे यह जानकर आश्चर्य हुआ कि इसने लॉगफाइल को इसके नए नाम पर ट्रैक किया, और "foo.log.old" को जोड़कर रखा।

विंडोज में, मैं इस तरह के व्यवहार से परिचित नहीं हूं - मुझे नहीं पता कि क्या इसे लागू करना संभव है। लिनक्स में यह व्यवहार कैसे लागू किया गया है? मैं इसके बारे में और कहाँ जान सकता हूँ?


मैं इसे एक जवाब के रूप में नहीं डाल रहा हूं क्योंकि मुझे वास्तव में नहीं पता है, लेकिन मुझे लगता है कि जब आप एक फ़ाइल को स्थानांतरित करते हैं तो इसे इनोड्स को नहीं बदला जाना चाहिए।
मैथेपी

जवाबों:


20

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

तो कई बातों के बारे में पता होना चाहिए:

  1. किसी फ़ाइल का उपयोग करने से mvउस अंडरलिंग नंबर में परिवर्तन नहीं होता है जब तक कि आप इसे फाइलसिस्टम में नहीं ले जाते हैं (जो cpतब उपयोग करने के बराबर होता हैrm मूल पर )।
  2. क्योंकि एक से अधिक नाम एक ही फाइल से जुड़ सकते हैं (यानी हमारे पास हार्ड लिंक हैं), "हटाए गए" फ़ाइलों में डेटा सभी तक नहीं जाता है कि अंडरलिंग फ़ाइल के संदर्भ चले जाते।
  3. शायद सबसे महत्वपूर्ण: जब एक प्रोग्राम openसा फ़ाइल यह उसके लिए एक संदर्भ बनाता है जो (जब डेटा हटा दिया जाएगा के उद्देश्यों के लिए) एक फ़ाइल नाम से जुड़ा होने के बराबर है।

यह कई व्यवहारों को जन्म देता है जैसे:

  • एक प्रोग्राम openपढ़ने के लिए एक फाइल कर सकता है, लेकिन वास्तव में इसे तब तक नहीं पढ़ता जब तक उपयोगकर्ता rmइसे कमांड लाइन पर एड करता है, और प्रोग्राम में अभी भी डेटा तक पहुंच होगी
  • आपके द्वारा सामना किया गया: mvफ़ाइल में आईएनजी फ़ाइल और आपके द्वारा खुले किसी भी प्रोग्राम के बीच के रिश्ते को डिस्कनेक्ट नहीं करता है (जब तक कि आप फाइलसिस्टम सीमाओं के पार नहीं जाते हैं, उस स्थिति में प्रोग्राम के पास अभी भी काम करने के लिए मूल का एक संस्करण है)।
  • यदि किसी प्रोग्राम में openलिखने के लिए फाइल एड है, और rmकमांड लाइन पर अंतिम फ़ाइल नाम है, तो प्रोग्राम फाइल में सामान रखने पर सही रख सकता है, लेकिन जैसे ही यह बंद होता है, उस डेटा का कोई और संदर्भ नहीं होगा और यह दूर हो जाएगा।
  • दो प्रोग्राम जो एक या एक से अधिक फ़ाइलों के माध्यम से संवाद करते हैं, वे फ़ाइल समाप्त होने के बाद फ़ाइल को हटाकर एक आंशिक, आंशिक सुरक्षा प्राप्त कर सकते openहैं। (यह वास्तविक सुरक्षा दिमाग नहीं है, यह सिर्फ एक गैपिंग छेद को रेस की स्थिति में बदल देता है।)

1
मैं @ डीमकी के साथ सहमत हूं, मैं सिर्फ नोट करना चाहता था: एक प्रोग्राम openपढ़ने और लिखने के लिए एक फाइल कर सकता है (जैसा कि प्रश्न में लॉग फ़ाइल के साथ हुआ है)।
jsbillings

@jsbillings: हां, लेकिन एक जोखिम है। यदि सभी फाइल सिस्टम के नाम समाप्त हो गए हैं, तो आप एक खुली फाइल में जीबी लिख सकते हैं जो सुबह के ओस की तरह वाष्पित हो जाएगी।
dmckee

1
इसके अलावा, इनकोड को कर्नेल में कॉपी किया जाता है और यही वह है जो डिस्क कॉपी पर संचालित होता है। तो फ़ाइल mv'd या cp 'हो सकती है, लेकिन एक खुली फ़ाइल पहले से ही कर्नेल डेटा स्टैक्चर्स के साथ काम कर रही है, न कि डिस्क संस्करण। इसलिए यदि आप किसी अन्य फ़ाइल को उस फ़ाइल में कॉपी करते हैं जो लिखने के लिए खुली है, तो प्रक्रिया अभी भी उसी सापेक्ष स्थिति में लिखी जाएगी जो पुरानी फ़ाइल में है। यही कारण है कि Apache httpd जैसे कार्यक्रमों में एक सिग्नल हैंडलर होता है जो लॉग फ़ाइलों को बंद और फिर से खोल देता है।
Arcege

0

वास्तव में यह देखने के लिए कि यह व्यवहार कैसे लागू किया गया है आप कुछ यूनिक्स प्रोग्रामिंग पुस्तकों को देख सकते हैं। माथेपीक सही है कि यह एक इनोड से संबंधित है। वास्तविक pathname का उपयोग केवल फाइल को खोलने के लिए किया जाता है, एक बार जब प्रोग्राम पूरा हो जाता है तो यह उसकी ओपन फाइल डिस्क्रिप्टर द्वारा संदर्भित करता है। बदले में फ़ाइल डिस्क्रिप्टर इनकोड को संदर्भित करता है, जो इस मामले में ध्यान नहीं देता है यदि अंतर्निहित फ़ाइलों का नाम बदल गया है।

जहां तक ​​विंडोज में इसे लागू करने की बात है, यह एक और साइट के लिए एक सवाल है।

किताबों को टटोलने के बिना इसके बारे में और अधिक पढ़ने के लिए बस लिनक्स फाइलसिस्टम और इनोड्स की खोज करें। एक स्पष्ट उत्तर नहीं हो सकता है, लेकिन आप यह समझने में सक्षम होंगे कि क्यों।


4
"चारों ओर खोजें - आपको शायद एक अच्छा उत्तर नहीं मिलेगा लेकिन यह समझ जाएगा" यह एक अच्छा जवाब नहीं है।
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.