(हम्म: निम्नलिखित अब एक महाकाव्य का एक सा है ...)
यूनिक्स फाइलसिस्टम पर निर्देशिका का डिज़ाइन (जो, पांडित्यपूर्ण होने के लिए, आमतौर पर यूनिक्स ओएस से जुड़ा नहीं होता है) एक अद्भुत अंतर्दृष्टि का प्रतिनिधित्व करता है, जो वास्तव में आवश्यक विशेष मामलों की संख्या को कम करता है।
एक 'डायरेक्टरी' वास्तव में फाइलसिस्टम में सिर्फ एक फाइल है। फाइलसिस्टम में फ़ाइलों की सभी वास्तविक सामग्री इनोड्स में है (आपके प्रश्न से, मैं देख सकता हूं कि आप इस सामान से पहले से ही अवगत हैं)। डिस्क पर इनोड्स की कोई संरचना नहीं है - वे बाइट्स के गिने हुए बब्स का सिर्फ एक बड़ा गुच्छा हैं, जो डिस्क पर मूंगफली-मक्खन की तरह फैला हुआ है। यह उपयोगी नहीं है, और वास्तव में साफ-सुथरी सोच के साथ किसी के लिए विकर्षक है।
केवल विशेष inode आइनोड संख्या 2 (नहीं 0 या 1, परंपरा के कारणों के लिए) है; इनकोड 2 एक निर्देशिका फ़ाइल है: रूट निर्देशिका । जब सिस्टम फाइलसिस्टम को मापता है, तो यह 'पता है' कि यह खुद को आरंभ करने के लिए इनकोड 2 इनकोड है।
एक निर्देशिका फ़ाइल सिर्फ एक फाइल है, जिसमें आंतरिक संरचना होती है जिसे ओपेंडिर (3) और दोस्तों द्वारा पढ़ा जाना चाहिए। आप dir (5) (अपने OS के आधार पर) में प्रलेखित इसकी आंतरिक संरचना देख सकते हैं; यदि आप उस पर गौर करते हैं, तो आप देखेंगे कि निर्देशिका फ़ाइल प्रविष्टि में फ़ाइल के बारे में लगभग कोई जानकारी नहीं है - यह फ़ाइल इनोड में है। इस फ़ाइल के बारे में कुछ चीजों में से एक यह है कि यदि आप एक मोड के साथ एक निर्देशिका फ़ाइल को खोलने की कोशिश करते हैं जो लेखन की अनुमति देता है तो खुले (2) फ़ंक्शन को एक त्रुटि दी जाएगी। विभिन्न अन्य कमांड (सिर्फ एक उदाहरण लेने के लिए hexdump
) , निर्देशिका फ़ाइलों के साथ सामान्य तरीके से कार्य करने से इंकार कर देंगे, सिर्फ इसलिए कि आप शायद ऐसा नहीं करना चाहते (लेकिन यह उनका विशेष मामला है, फाइलसिस्टम का नहीं)।
एक हार्ड लिंक एक निर्देशिका फ़ाइल के नक्शे में एक प्रविष्टि से अधिक और न ही कम है। आपके पास ऐसे नक्शे में दो (या अधिक) प्रविष्टियाँ हो सकती हैं जो दोनों एक ही इनोड संख्या में मैप करती हैं: इसलिए इनोड में दो (या अधिक) हार्ड लिंक हैं। यह भी बताता है कि क्यों हर फ़ाइल में कम से कम एक 'हार्ड लिंक' होता है। इनकोड में एक संदर्भ गणना होती है, जो यह बताती है कि फाइल सिस्टम में कहीं-कहीं निर्देशिका फ़ाइल में इनकोड का उल्लेख किया गया है (यह वह संख्या है जिसे आप करते समय देखते हैं ls -l
)।
ठीक है: हम अब बात कर रहे हैं।
डायरेक्टरी फाइल स्ट्रिंग्स ('फाइलनाम') से लेकर नंबर्स (इनोड नंबर) तक का मैप है। वे इनोड संख्या उन फाइलों के इनोड की संख्या है जो उस निर्देशिका में 'इन' हैं। वे फाइलें जो उस निर्देशिका में 'इन' हैं, उनमें अन्य निर्देशिका फाइलें शामिल हो सकती हैं, इसलिए उनकी इनोड संख्या निर्देशिका में सूचीबद्ध लोगों के बीच होगी। इस प्रकार, यदि आपके पास कोई फ़ाइल है /tmp/foo/bar
, तो निर्देशिका फ़ाइल foo
में एक प्रविष्टि शामिल है bar
, जो उस स्ट्रिंग को उस फ़ाइल के लिए इनोड में मैप कर रही है। निर्देशिका फ़ाइल के लिए निर्देशिका फ़ाइल में एक प्रविष्टि भी है /tmp
, foo
जो निर्देशिका में 'इन' है /tmp
।
जब आप mkdir (2) के साथ एक निर्देशिका बनाते हैं, तो वह कार्य करता है
- सही आंतरिक संरचना के साथ एक निर्देशिका फ़ाइल (कुछ इनोड संख्या के साथ) बनाता है,
- मूल निर्देशिका में एक प्रविष्टि जोड़ता है, नई निर्देशिका का नाम इस नए इनोड में मैप करता है (जो किसी एक लिंक के लिए खाता है),
- नई निर्देशिका में एक प्रविष्टि जोड़ता है, स्ट्रिंग मैपिंग '।' समान इनोड (यह अन्य लिंक के लिए खाता है), और
- नई निर्देशिका में एक और प्रविष्टि जोड़ता है, स्ट्रिंग को मैप करते हुए .. '' डायरेक्टरी फाइल के इनोड में इसे चरण (2) में संशोधित किया जाता है (यह उन बड़ी लिंक की बड़ी संख्या के लिए है जो आप निर्देशिका फ़ाइलों पर देखेंगे जो उपनिर्देशिकाएँ हैं। )।
अंतिम परिणाम यह है कि (लगभग) केवल विशेष मामले हैं:
- खुला (2) फ़ंक्शन आपको लिखने के लिए निर्देशिका फ़ाइलों को खोलने से रोककर, अपने आप को पैर में गोली मारने के लिए कठिन बनाने की कोशिश करता है।
- Mkdir (2) फ़ंक्शन नई निर्देशिका फ़ाइल में कुछ अतिरिक्त प्रविष्टियों (''। 'और' .. ') को जोड़कर चीजों को अच्छा और आसान बनाता है, विशुद्ध रूप से इसे फाइलसिस्टम के चारों ओर स्थानांतरित करने के लिए सुविधाजनक बनाता है। मुझे संदेह है कि फाइलसिस्टम बिना पूरी तरह से काम करेगा '।' और '..', लेकिन उपयोग करने के लिए एक दर्द होगा।
- निर्देशिका फ़ाइल कुछ प्रकार की फ़ाइलों में से एक है, जिन्हें 'विशेष' के रूप में चिह्नित किया जाता है - यह वास्तव में है जो खुली (2) जैसी चीजों को थोड़ा अलग तरीके से व्यवहार करने के लिए कहती है।
st_mode
स्टेट में देखें (2)।
(स्टैकओवरफ्लो मूल प्रश्न, 2011-10-20 से कॉपी किया गया)
..
हार्डलिंक करते हैं तो आपके ट्री वॉकिंग सॉफ़्टवेयर को पहले से ही "मूल निर्देशिका लिंक पर निम्न चक्रों का पालन न करना" अपवादों की आवश्यकता होती है, इसलिए.
लिंक को छोड़कर यह बहुत ही जटिल जटिलता है ।