यूनिक्स पर, आम तौर पर, एक फाइल फाइलों की तालिका में कुछ प्रविष्टि होती है। विभिन्न प्रकार की फाइलें हैं: नियमित फाइलें, उपकरण, प्रतीकात्मक लिंक, दरवाजे, पाइप, सॉकेट, निर्देशिका ...
इनकोड संख्या (जिसे आप आउटपुट में देख सकते हैं ls -i
) उस तालिका में अनुक्रमणिका है।
अब, आप फ़ाइलों को इनकोड द्वारा नहीं बल्कि पथ द्वारा एक्सेस करते हैं । एक पथ निर्देशिका प्रविष्टियों की एक श्रृंखला है । आप देखेंगे कि हम यहां फ़ोल्डर की नहीं बल्कि निर्देशिका की बात कर रहे हैं। क्योंकि यह वही है जो एक निर्देशिका है (एक फोन निर्देशिका के बारे में सोचो)।
एक निर्देशिका एक विशेष प्रकार की फ़ाइल है जो कई संख्या में इनोड्स को नाम देती है। एक निर्देशिका प्रविष्टि एक इनोड में एक नाम से एक मानचित्रण है।
एक दी गई फ़ाइल (इनोड) में एक निर्देशिका में एक से अधिक नाम हो सकते हैं (जैसे किसी फ़ोन नंबर पर एक से अधिक नाम हो सकते हैं), और एक से अधिक निर्देशिका में नाम (प्रविष्टियाँ) भी हो सकते हैं। उन लिंक को हार्ड लिंक के रूप में भी जाना जाता है जिन्हें सॉफ्ट लिंक (एक विशेष प्रकार की फ़ाइल जो एक पथ के लिए एक संकेतक है) के साथ भेद करने के लिए कहा जाता है ।
एक फ़ाइल (इनोड) लिंक की संख्या (किसी भी निर्देशिका में प्रविष्टियों की) का ट्रैक रखता है, ताकि जब यह संख्या 0 तक पहुंच जाए (जब इसे अंतिम निर्देशिका से अनलिंक किया जा रहा हो), तो इसे हटा दिया जाता है।
वह संख्या (लिंक की संख्या) है जो ls -l
आउटपुट में प्रदर्शित होती है ।
जब एक गैर-निर्देशिका फ़ाइल पहली बार (के साथ) बनाई जाती है open
या creat
(या bind
या mknod
फ़ाइलों के कुछ प्रकार के) सिस्टम कॉल के लिए), यह नई फ़ाइल (जैसे करने के लिए एक मार्ग के साथ उपलब्ध कराने के द्वारा किया जाता है "/a/b"
)। फिर क्या होता है एक नई फ़ाइल और इनोड आवंटित किया जाता है और रूट निर्देशिका "a"
में नाम के साथ जुड़ी निर्देशिका में एक नई प्रविष्टि जोड़ी जाती है "/"
। यह प्रारंभिक लिंक है इसलिए लिंक गणना एक है।
link()
सिस्टम कॉल ( ln
कमांड) के साथ अधिक लिंक बाद में जोड़े जा सकते हैं । और लिंक को unlink()
सिस्टम कॉल ( rm
कमांड) के साथ हटाया जा सकता है ।
आप देखेंगे कि टाइप डायरेक्टरी की फाइलों में आम तौर पर लिंक की संख्या 2 या उससे अधिक होती है।
अब, जब आप एक निर्देशिका बनाते हैं, तो आप mkdir()
सिस्टम कॉल कर रहे हैं । कुछ इस तरह mkdir("/a/b")
। फिर यह क्या करता है एक नई फाइल टाइप डायरेक्टरी आवंटित की जाती है। उस नई निर्देशिका में, यह स्वचालित रूप से दो प्रविष्टियाँ बनाता है:
"."
( डॉट निर्देशिका के लिए )। जो अपने आप में एक कड़ी है। तो लिंक गिनती अब 1 है।
".."
( निर्देशिका की निर्देशिका के लिए )। जिसका लिंक है "/a"
। इसलिए लिंक की गिनती "/a"
एक से बढ़ कर है
फिर उस नई निर्देशिका को "/a"
(इसके लिए एक प्रविष्टि जोड़ी गई "/a"
है) से जोड़ा गया है , इसलिए इसकी लिंक गणना अब 2. यदि है"/a/b/c"
निर्देशिका बनाई गई है, तो ".."
प्रविष्टि के कारण "/a/b/c"
, लिंक की संख्या "/a/b"
3 हो जाएगी।
अधिकांश यूनियनों ने एक निर्देशिका के आगे लिंक बनाने को प्रतिबंधित किया है क्योंकि वे समस्याग्रस्त छोरों का कारण बन सकते हैं। जब वे link()
एक निर्देशिका पर अनुमति देते हैं , तो आम तौर पर केवल सुपरयुसर ही कर सकता है।
कुछ फाइलसिस्टम btrfs
उस पारंपरिक निर्देशिका संरचना से प्रस्थान करते हैं। आप देखेंगे कि लिंक निर्देशिकाओं में मायने रखता हैbtrfs
फ़ाइल सिस्टम हमेशा एक होते हैं, भले ही उन निर्देशिकाओं में एक "."
ही इनकोड संख्या के साथ एक प्रविष्टि होती है, जिसमें वे स्वयं होते हैं।
तथ्य यह है कि लिंक की गिनती पारंपरिक रूप से 2 से अधिक है और उप-विभाजकों की संख्या में इसका उपयोग होता है। उदाहरण के लिए, इसमें:
find . -name '*.c' -print
अगर .
सबडिर नहीं होते हैं, लेकिन लाखों फाइलें होती हैं। की लिंक गणना की जाँच करके .
, find
यह जान सकते हैं कि कोई उपखंड नहीं है। इसलिए सभी find
को निर्देशिका की सामग्री को पढ़ना होगा और उन प्रविष्टियों की रिपोर्ट करनी होगी जो .c
( grep '\.c$'
कुछ मेगाबाइट फ़ाइल पर, कोई बड़ी बात नहीं है)। अन्यथा, find
हर एक फ़ाइल के प्रकार को देखना होगा कि क्या वहाँ निर्देशिका में उतरना है (परिणामस्वरूप कई lstat()
सिस्टम कॉल)। बेशक, इस तरह का अनुकूलन अभी भी आवश्यक नहीं है)।btrfs
(हालांकि लिनक्स के आधुनिक संस्करणों में, फ़ाइलों के प्रकार को कुछ फाइलसिस्टम (सहित btrfs
) के लिए निर्देशिका प्रविष्टि में भी संग्रहीत getdents(2)
किया जाता है और प्रविष्टियों की सूची को पुनः प्राप्त करने के लिए उपयोग किए गए सिस्टम कॉल द्वारा लौटाया जाता है एक निर्देशिका में, इसलिएlstat