फ़ाइल डिस्क्रिप्टर बनाम फ़ाइल नाम


12

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

उदाहरण के लिए, /dev/fd/0, /dev/stdin, और /proc/self/fd/0करने के लिए सभी लिंक कर रहे हैं /dev/pts/2। क्या ये चार फ़ाइल विवरणकर्ता हैं, या फ़ाइल नाम हैं?


जवाबों:


12

सभी चार /dev/fd/0, /dev/stdin, /proc/self/fd/0और /dev/pts/2फ़ाइल नाम हैं, के रूप में कर रहे हैं /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, आदि सभी लेकिन यह है कि पिछले उदाहरण आपकी मशीन पर किसी मौजूदा फ़ाइल के नाम होने की संभावना है। एक फ़ाइल नाम एक स्ट्रिंग है जो आपके फाइल सिस्टम पर एक फाइल को नामित कर सकती है; लिनक्स के तहत, किसी भी स्ट्रिंग में एक अशक्त बाइट नहीं होता है और जो सबसे अधिक 4096 बाइट्स पर होता है वह एक मान्य फ़ाइल नाम है। इन नामों में से बहुत से बराबर, जैसे हैं /bin/shहै के बराबर ///bin/sh, /bin/../bin/sh(यह मानते हुए /binएक मौजूदा निर्देशिका है), आदि सभी उदाहरण मैं दे दिया है अब तक पूर्ण फ़ाइल नाम कर रहे हैं; वहाँ भी रिश्तेदार फ़ाइल नाम हैं, जो एक के साथ शुरू नहीं है /और जिसका अर्थ वर्तमान निर्देशिका पर निर्भर करता है।

फ़ाइल नामों के आसपास की शब्दावली सार्वभौमिक नहीं है; कभी-कभी "फ़ाइल नाम" का अर्थ फ़ाइल का पूर्ण पथ होता है, और कभी-कभी इसका अर्थ है निर्देशिका प्रविष्टि का नाम। POSIX शब्दावली एक निर्देशिका प्रविष्टि के नाम के लिए " फ़ाइलनाम " या " pathname घटक " है, और एक पूर्ण पथ के लिए " pathname "।

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

फ़ाइल डिस्क्रिप्टर एक फ़ाइल के अनुरूप हो सकता है और संबंधित नाम हो सकता है, लेकिन सभी ऐसा नहीं करते हैं। ऐसा करने वालों के लिए, फ़ाइल एक नियमित फ़ाइल, एक निर्देशिका, एक डिवाइस फ़ाइल या एक नामित पाइप (जिसे FIFO भी कहा जाता है) (द्वारा बनाई गई तरह mkfifo) हो सकती है; कुछ प्रणालियों में आगे की संभावनाएं हैं जैसे कि यूनिक्स सॉकेट और दरवाजे। फ़ाइल डिस्क्रिप्टर के उदाहरण जिनके पास संबद्ध फ़ाइल नहीं है, उनमें पाइप (जिस तरह से बनाया गया है pipe) और नेटवर्किंग सॉकेट शामिल हैं

/dev/fd/0, /dev/stdinऔर /proc/self/fd/0एक अजीब अर्थ के साथ फ़ाइल नाम (सभी समतुल्य) हैं: वे सभी को निर्दिष्ट करते हैं जो भी फाइल वर्तमान में फ़ाइल डिस्क्रिप्टर 0. के माध्यम से एक्सेस की जाती है। जब कोई प्रक्रिया इन्हें खोलती है, तो कर्नेल इंडेक्स 0 के साथ प्रविष्टि को फाइल डिस्क्रिप्टर टेबल में एक नए रूप में कॉपी करता है। वर्णनकर्ता। इनमें से किसी भी फाइल को खोलना कॉलिंग के बराबर है dup(0)। नामित फाइलें अप्रत्यक्ष रूप से एक नई फ़ाइल खोलने के बजाय अपनी पहले से खुली फाइलों में से एक का उपयोग करने के लिए एक प्रक्रिया है; वे ज्यादातर प्रोग्राम की कमांड लाइन पर पास करने के लिए उपयोगी होते हैं, जहां प्रोग्राम को किसी फ़ाइल के नाम को खोलने की उम्मीद है।


@ जील्स आपने लिखा है "फ़ाइल डिस्क्रिप्टर तालिका में प्रत्येक प्रविष्टि यह बताती है कि अगर फाइल डिस्क्रिप्टर पर पढ़ने, लिखने और अन्य कार्यों का अनुरोध करता है तो क्या करना है ।" ( जोर देकर मेरा)। जहां तक ​​मुझे समझ में आया है कि यह स्टैंड, स्टडआउट और स्टैडर के लिए क्रमशः मानक 0,1,2 आदि की तरह एक पूर्णांक है। यह नियमित फ़ाइलों के लिए उच्च मूल्यवान संख्या होगी। मुझे आपकी टिप्पणी से नहीं मिल रहा है कि यह संख्या कैसे इंगित करती है "अगर फाइल डिस्क्रिप्टर पर प्रक्रिया पढ़ने, लिखने और अन्य कार्यों का अनुरोध करती है तो क्या करना है।" । क्या आप इस पर थोड़ा विस्तार कर सकते हैं?
Geek

@ Geek फ़ाइल डिस्क्रिप्टर तालिका में एक प्रविष्टि एक संख्या नहीं है। संख्या उस तालिका में अनुक्रमणिका है।
गाइल्स का SO- बुराई पर रोक '

@ मेरी गलतफहमी को स्पष्ट करने के लिए धन्यवाद। मैं अब इसे बेहतर समझ रहा हूं। तो क्या आप अपने उत्तर में "क्या करें" भाग का उदाहरण दे सकते हैं। मैंने इकट्ठा किया कि फ़ाइल डिस्क्रिप्टर तालिका में प्रत्येक प्रविष्टि में एक फ़ाइल तालिका के लिए फिर से सूचक होता है जिसमें फ़ाइल ऑफ़सेट, फ़ाइल स्थिति आदि जैसी जानकारी होती है, लेकिन मैं अभी भी आपके उत्तर में "क्या करना है" भाग पर स्पष्ट नहीं है।
गीक

2

फाइलनेम फाइलसिस्टम पर फाइल का सिर्फ एक नाम है, इससे ज्यादा कुछ नहीं - यह सिर्फ एक स्ट्रिंग है।

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

कोड में, फ़ाइल डिस्क्रिप्टर एक चर है, जो कर्नेल में किसी चीज़ का सूचक है, जो फ़ाइल ऑब्जेक्ट का प्रतिनिधित्व करता है।

उदाहरण के लिए, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 सभी लिंक / dev / pts / 2 हैं। क्या ये चार फ़ाइल विवरणकर्ता हैं, या फ़ाइल नाम हैं?

यह सभी छद्म फाइलें हैं, जो कुछ लिपियों या कार्यक्रमों के लिए उपयोगी हो सकती हैं। आप उन्हें खोल सकते हैं और खोल सकते हैं () आपको एक फ़ाइल विवरणक लौटाएगा।

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