एक निर्देशिका "विशेष प्रकार की फ़ाइल" कैसे है?


23

मैं इस यूनिक्स ट्यूटोरियल को पढ़ रहा हूं और इस उद्धरण के साथ आया हूं ...

हमें यहां ध्यान देना चाहिए कि एक निर्देशिका एक विशेष प्रकार की फ़ाइल है।

... लेकिन कोई स्पष्टीकरण या विवरण प्रदान नहीं किया जाता है। कैसे एक निर्देशिका वास्तव में सिर्फ एक फ़ाइल है?


जवाबों:


19

* निक्स स्टाइल (और अन्य) ऑपरेटिंग सिस्टम में कई संस्थाओं को फाइल माना जाता है, या एक परिभाषित फ़ाइल जैसा पहलू होता है, भले ही वे जरूरी नहीं कि एक फाइल सिस्टम में संग्रहीत बाइट्स का एक क्रम हो। वास्तव में निर्देशिकाओं को कैसे कार्यान्वित किया जाता है यह फाइलसिस्टम के प्रकार पर निर्भर करता है, लेकिन आम तौर पर वे जो होते हैं, एक सूची के रूप में माना जाता है, संग्रहीत बाइट्स का एक क्रम है, इसलिए इस अर्थ में वे विशेष नहीं हैं।

एक "फ़ाइल" को परिभाषित करने का एक तरीका * निक्स संदर्भ में है कि यह एक ऐसी चीज है जिसमें एक फाइल डिस्क्रिप्टर जुड़ा हुआ है। विकिपीडिया लेख के अनुसार, एक फ़ाइल विवरणक

एक अमूर्त संकेतक है जिसका उपयोग किसी फ़ाइल या अन्य इनपुट / आउटपुट संसाधन तक पहुंचने के लिए किया जाता है , जैसे कि पाइप या नेटवर्क कनेक्शन ...

दूसरे शब्दों में, वे विभिन्न प्रकार के संसाधनों को संदर्भित करते हैं जिनसे / बाइट्स का एक क्रम पढ़ा / लिखा जा सकता है, हालांकि उस अनुक्रम का स्रोत / गंतव्य अनिर्दिष्ट है। दूसरा तरीका रखो, संसाधन का "जहां" कुछ भी हो सकता है। यह परिभाषित करता है कि यह सूचनाओं का एक समूह है। यह कभी-कभी यह कहा जाता है कि यूनिक्स में "सब कुछ एक फ़ाइल है" का हिस्सा है। आपको इसे पूरी तरह से शाब्दिक रूप से नहीं लेना चाहिए, लेकिन यह गंभीर विचार के लायक है। एक निर्देशिका के मामले में, यह जानकारी उस निर्देशिका से संबंधित है, और निम्न, कार्यान्वयन स्तर पर, इसे फ़ाइल सिस्टम के भीतर कैसे खोजा जाए।

निर्देशिकाएँ इस अर्थ में विशेष प्रकार की हैं क्योंकि देशी सी कोड में वे किसी फाइल डिस्क्रिप्टर से संबंधित नहीं हैं; POSIX एपीआई धारा संभाल एक विशेष प्रकार का उपयोग करता है, DIR*। हालांकि, इस प्रकार का वास्तव में एक अंतर्निहित विवरणक होता है जिसे पुनर्प्राप्त किया जा सकता है । डिस्क्रिप्टर्स को कर्नेल द्वारा प्रबंधित किया जाता है और उन्हें एक्सेस करने में हमेशा सिस्टम कॉल शामिल होते हैं, इसलिए, एक डिस्क्रिप्टर का दूसरा पहलू यह है कि यह ओएस कर्नेल द्वारा नियंत्रित एक नाली है। उनके पास 0 से शुरू होने वाली अनूठी (प्रति प्रक्रिया) संख्याएं हैं, जो आमतौर पर मानक इनपुट स्ट्रीम के लिए विवरणक है।


2
POSIX.1-2008 ने सिस्टम कॉल ( , आदि) का एक गुच्छा जोड़ा openat, fstatatजो निर्देशिकाओं का जिक्र करते हुए फ़ाइल डिस्क्रिप्टर का उपयोग करता है।
zwol

2
और भी दिलचस्प बात यह है कि आप fsync()केवल पढ़ने के लिए (!) निर्देशिका fd कर सकते हैं, और इसका एक अच्छी तरह से परिभाषित प्रभाव है (विशेष रूप से, यह डिस्क में दिए गए निर्देशिका में फ़ाइल निर्माण / नाम बदलने / हटाने को सिंक करता है, "लिखने में एक सैद्धांतिक रूप से आवश्यक कदम" एक अस्थायी फ़ाइल के लिए और मूल "मुहावरे" पर इसका नाम बदलें।
केविन

13

बातें करने के यूनिक्स तरीके में: सब कुछ एक फ़ाइल है।

निर्देशिका एक (कई में से एक) विशेष फ़ाइल का प्रकार है। इसमें डेटा शामिल नहीं है। इसके बजाय, यह निर्देशिका के भीतर समाहित सभी फ़ाइलों के संकेत देता है।

अन्य प्रकार की विशेष फाइलें:

  • लिंक
  • सॉकेट
  • उपकरण

लेकिन क्योंकि उन्हें "फाइलें" माना जाता है, आप lsउन्हें बदल सकते हैं और उनका नाम बदल सकते हैं और विशेष फ़ाइल के प्रकार के आधार पर, उनसे डेटा भेज सकते हैं / कर सकते हैं।


1
और इससे जीवन बहुत आसान हो जाता है, क्योंकि आपको कुछ अलग करने की ज़रूरत नहीं है क्योंकि यह एक निर्देशिका है। यह प्रोग्राम लिखने के साथ-साथ कमांड लाइन (या GUI) से संचालन पर लागू होता है।
गब्ररी

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

11

मेरा उत्तर केवल स्मरण है, लेकिन 199x विंटेज यूनिक्स में, जिनमें से कई थे, निर्देशिकाएं फाइलें थीं, बस ऑन-डिस्क इनोड में कहीं न कहीं "निर्देशिका" चिह्नित की गई थी।

आप कुछ के साथ एक निर्देशिका खोल सकते हैं open(".", O_RDONLY)और एक प्रयोग करने योग्य फ़ाइल विवरणक वापस प्राप्त कर सकते हैं। आप सामग्री को पार कर सकते हैं यदि आप के माध्यम से छानबीन की/usr/include और सही सी संरचना परिभाषा पाया। मुझे पता है कि मैंने यह SunOS 4.1.x सिस्टम, SGI के EFS फाइल सिस्टम के लिए किया था, और जो भी DEC के Mips-CPU वर्कस्टेशन एक फाइल सिस्टम के लिए था, शायद BSD4.2 FFS।

वह एक बुरा अनुभव था। वर्चुअल फाइलसिस्टम लेयर पर मानकीकरण पोर्टेबिलिटी के लिए एक अच्छी बात है, भले ही निर्देशिका अब सख्त फाइलें नहीं हैं। VFS लेयर्स हमें filesystems के साथ प्रयोग करने देती हैं जहाँ डायरेक्टरीज़ फाइल नहीं हैं, जैसे ReiserFS या NFS।



1
आप अभी भी एक निर्देशिका खोल सकते हैं और इसे आज कुछ यूनिक्स वेरिएंट पर एक फ़ाइल के रूप में पढ़ सकते हैं, उदाहरण के लिए यह अभी भी FreeBSD 10.1 पर संभव है। (कैन
stop

@ मुझे लगता है कि यह बहुत तार्किक होगा यदि dd द्वारा कॉपी की गई निर्देशिका अनिवार्य रूप से एक समकक्ष होगी cp --link dir1/* dir2, हालांकि मुझे हमारी उपयोगिता के बारे में निश्चित नहीं है।
पीटर कहते हैं कि मोनिका

3

एक निर्देशिका इस मायने में विशेष है कि इसमें 'd' अपने मोड में है, फाइलसिस्टम को यह बताते हुए कि इसे अपनी सामग्री की व्याख्या निर्देशिका के भीतर मौजूद अन्य फाइलों की सूची के रूप में करनी चाहिए, बजाय एक नियमित फाइल के जो बाइट्स का एक क्रम है। आवेदन द्वारा पढ़ें। बस इतना ही।


सभी फाइल सिस्टम के साथ चीजें इतनी सरल नहीं हैं - उदाहरण के लिए, Apple के HFS + में केवल एक बड़ा B + ट्री है जिसमें सभी रास्ते हैं, अगर मुझे सही याद है - लेकिन यह अवलोकन यूनिक्स फाइल सिस्टम के लिए और BSD के ffs सहित, के लिए हाजिर है, जो संभवत: उद्धृत ट्यूटोरियल के लेखक क्या सोच रहे थे।
22

2

निर्देशिकाएँ फाइलें हैं क्योंकि लिनक्स सिस्टम सार्वभौमिक i / o मॉडल को नियोजित करता है । मॉडल में सिस्टम में सब कुछ एक फाइल है और इसे एक ही सिस्टम कॉल और विभिन्न कमांड के साथ एक्सेस किया जा सकता है।

वे विशेष प्रकार के होते हैं क्योंकि उनके i-nodes में फ़ाइल प्रकार के लिए चिह्न होता है और उनके पास फ़ाइल नाम और अन्य i-nodes के लिंक होने की एक विशेष संरचना होती है। ये फ़ाइल नाम-लिंक जोड़े, जिन्हें "हार्डलिंक्स" के रूप में भी जाना जाता है, एक डायरेक्टरी के आई-नोड में डायरेक्टरी के अंदर "फाइल्स" को एन्यूमरेट करते हैं।

निर्देशिकाएँ सिर्फ फाइलों के आयोजन के लिए हैं। जब एक फ़ाइल को एक निर्देशिका से दूसरे में "स्थानांतरित" किया जाता है, तो फ़ाइल स्वयं डिस्क में स्थानांतरित नहीं होती है। यह सिर्फ इतना है कि एक निर्देशिका i-nodes में एक प्रविष्टि हटा दी जाती है और दूसरी निर्देशिका i-node में लिखी जाती है।


-3

स्वीकृत उत्तर पूरी तरह से सही नहीं है। POSIX सिस्टम में, "इनोड्स" फाइलों और निर्देशिकाओं की ओर इशारा करता है। फ़ाइल डिस्क्रिप्टर्स केवल एक प्रक्रिया के लिए अद्वितीय हैं, और सिस्टम के पार नहीं। हालाँकि, इनोड्स अद्वितीय हैं, हालांकि एक से अधिक इनोड एक सिंगल फाइल को इंगित कर सकते हैं। स्वीकार किए गए उत्तर पर टिप्पणी की होगी, लेकिन प्रतिनिधि प्रतिबंध के कारण नहीं कर सकता।


2
नहीं, केवल 1 इनकोड एक ही फ़ाइल को इंगित कर सकता है। यद्यपि एक ही इनोड एक साथ कई निर्देशिकाओं (या कई नामों पर) में मौजूद हो सकता है। एक आसान जांच: ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt। तो आप देखेंगे, कि हार्ड लिंक में एक ही इनकोड नंबर होता है।
पीटर ने कहा कि मोनिका

@peterh फ़ाइल वर्णनकर्ता केवल एक प्रक्रिया के लिए अद्वितीय हैं। क्या तुम समझा सकते हो?
१०:२ 'को १

1
@ Md.AlaminMahamud यह सच नहीं है, अगर एक प्रक्रिया है, तो fork()उसके बच्चे की प्रक्रिया (कुछ विशेष परिस्थितियों को छोड़कर, अर्थात् एक O_CLOEXECध्वज को छोड़कर ) बिल्कुल उसी तरह का एक ही दर्जकर्ता संस्थाएं होंगी जैसा कि मूल प्रक्रिया थी। एक और उदाहरण: अपाचे बच्चे की प्रक्रिया listen()एक ही सॉकेट फ़ाइल डिस्क्रिप्टर पर आईएनजी है। लेकिन यह उत्तर फ़ाइल डिस्क्रिप्टर के बारे में नहीं है, जो कर्नेल-आंतरिक डेटा संरचना है और केवल कर्नेल मेमोरी में मौजूद है। यह ( गलत ) उत्तर निर्देशिका प्रविष्टियों और इनोड्स के बारे में है, ये ऑन-डिस्क एंटिटीज़ हैं (यानी वे हार्ड ड्राइव पर भौतिक बाइट्स हैं)।
पीटर कहते हैं मोनिका

1
@ Md.AlaminMahamud खैर, अब मुझे बहुत यकीन नहीं है, उदाहरण के लिए अगर ऐसा fork()होता है और फिर बच्चे की प्रक्रिया seek()एस या close()एस होती है, तो यह अभिभावक की फ़ाइल विवरणक को प्रभावित नहीं करेगा। तो मैं अब सोच रहा हूं, कि फ़ाइल विवरण केवल आंशिक रूप से प्रक्रिया-निजी संरचनाएं हैं। लेकिन यह सवाल उनके बारे में नहीं है, यह सवाल डायरेंट्स / इनोड्स के बारे में है और मैं आपको इस सवाल का पूरी तरह से गलत जवाब देने पर टिप्पणी कर रहा हूं।
पीटर कहते हैं मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.