समझ / देव और इसके उपखंड और फाइलें


51
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. मैं सोच रहा था कि क्या सभी फाइलें /devऔर इसके उपनिर्देशिका के तहत सभी फाइल डिवाइस के डिस्क्रिप्टर हैं?
  2. एक-दूसरे से इतने संबंध क्यों हैं? उदाहरण के लिए, /dev/fd/0, /dev/stdin, /proc/self/fd/0सभी लिंक करने के लिए कर रहे हैं /dev/pts/2
  3. अगर lमें lrwx------मतलब लिंक, क्या करता है cमें crw--w---- क्या मतलब है?

3
और # 3 का जवाब देने के लिए, सी का मतलब है चरित्र उपकरण, या चरित्र विशेष । b का मतलब ब्लॉक स्पेशल है
felixphew

जवाबों:


77

लगभग सभी के अंतर्गत फ़ाइलें /devहैं डिवाइस फ़ाइलें । जबकि एक नियमित फ़ाइल को पढ़ना और लिखना एक डिस्क या अन्य फाइल सिस्टम पर डेटा संग्रहीत करता है, डिवाइस फ़ाइल तक पहुंचने से कर्नेल में एक ड्राइवर के साथ संचार होता है, जो आमतौर पर हार्डवेयर के एक टुकड़े (एक हार्डवेयर डिवाइस, इसलिए नाम) के साथ संचार करता है।

डिवाइस फ़ाइलों के दो प्रकार हैं: ब्लॉक डिवाइस ( bआउटपुट में पहला चरित्र के रूप में दर्शाया गया है ls -l), और चरित्र डिवाइस (संकेत द्वारा c)। ब्लॉक और चरित्र उपकरणों के बीच का अंतर पूरी तरह से सार्वभौमिक नहीं है। ब्लॉक डिवाइस डिस्क की तरह की चीजें हैं, जो बड़ी, निश्चित आकार की फाइलों की तरह व्यवहार करती हैं: यदि आप एक निश्चित ऑफसेट पर एक बाइट लिखते हैं, और बाद में उस ऑफसेट पर डिवाइस से पढ़ा जाता है, तो आपको वह बाइट वापस मिल जाती है। कैरेक्टर डिवाइस कुछ और ही होते हैं, जहां बाइट लिखने का कुछ तात्कालिक प्रभाव होता है (जैसे कि यह एक सीरियल लाइन पर उत्सर्जित होता है) और एक बाइट को पढ़ने से कुछ तात्कालिक प्रभाव भी होता है (जैसे कि यह सीरियल पोर्ट से पढ़ा जाता है)।

डिवाइस फ़ाइल का अर्थ उसके नंबर से निर्धारित होता है, उसके नाम से नहीं (नाम अनुप्रयोगों के लिए मायने रखता है, लेकिन कर्नेल के लिए नहीं)। संख्या वास्तव में दो नंबर है: प्रमुख संख्या इंगित करती है कि इस डिवाइस के लिए कौन सा ड्राइवर जिम्मेदार है, और मामूली संख्या एक ड्राइवर को कई डिवाइस चलाने की अनुमति देती है। ये नंबर ls -lलिस्टिंग में दिखाई देते हैं , जहाँ आपको सामान्य रूप से फ़ाइल का आकार मिलेगा। उदा brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ यह उपकरण प्रमुख major, लघु ० है।

कुछ डिवाइस फ़ाइलें /devहार्डवेयर डिवाइस के अनुरूप नहीं होती हैं। हर यूनिक्स प्रणाली पर मौजूद एक है /dev/null; इस पर लिखने का कोई प्रभाव नहीं है, और इससे पढ़ने से कोई डेटा वापस नहीं आता है। शेल स्क्रिप्ट्स में यह अक्सर सुविधाजनक होता है, जब आप आउटपुट को कमांड ( >/dev/null) से अनदेखा करना चाहते हैं या बिना इनपुट के कमांड चलाते हैं ( </dev/null)। अन्य सामान्य उदाहरण हैं /dev/zero(जो अशक्त बाइट्स विज्ञापन infinitum/dev/urandom लौटाता है ) (जो यादृच्छिक बाइट्स विज्ञापन infinitum लौटाता है )।

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

आपको कई प्रतीकात्मक लिंक मिलेंगे /dev। यह ऐतिहासिक कारणों से हो सकता है: एक डिवाइस फ़ाइल को एक नाम से दूसरे नाम पर ले जाया गया था, लेकिन कुछ एप्लिकेशन अभी भी पुराने नाम का उपयोग करते हैं। उदाहरण के लिए, लिनक्स के तहत /dev/scd0एक प्रतीकात्मक लिंक है /dev/sr0; दोनों पहले सीडी डिवाइस को नामित करते हैं। सांकेतिक लिंक के लिए एक अन्य कारण संगठन है: लिनक्स के तहत, आप कई स्थानों में अपनी हार्ड डिस्क और विभाजन मिल जाएगा: /dev/sdaऔर /dev/sda1और दोस्तों (प्रत्येक डिस्क एक मनमाना पत्र द्वारा नामित, और विभाजन विभाजन लेआउट के अनुसार), /dev/disk/by-id/*(डिस्क एक द्वारा नामित अद्वितीय सीरियल नंबर), /dev/disk/by-label/*(एक फाइलसिस्टम के साथ विभाजन, एक मानव-चयनित लेबल द्वारा निर्दिष्ट); और अधिक। जब एक जेनेरिक डिवाइस का नाम कई में से एक हो सकता है तो प्रतीकात्मक लिंक का भी उपयोग किया जाता है; उदाहरण के लिए/dev/dvdयदि आप दो सीडी रीडर हैं और दूसरा एक डिफ़ॉल्ट डीवीडी रीडर होना है, तो /dev/sr0यह एक प्रतीकात्मक लिंक हो सकता है या यह एक लिंक हो सकता है /dev/sr1

अंत में, /devपारंपरिक कारणों से कुछ अन्य फाइलें हैं जिन्हें आप खोज सकते हैं । आपको हर सिस्टम पर समान नहीं मिलेगा। अधिकांश यूनियनों पर, /dev/logएक सॉकेट है जो प्रोग्राम लॉग संदेशों का उत्सर्जन करने के लिए उपयोग करते हैं। /dev/MAKEDEVएक स्क्रिप्ट है जो प्रविष्टियों को बनाता है /dev। आधुनिक लिनक्स सिस्टम पर, प्रविष्टियां udev/dev/ द्वारा स्वचालित रूप से बनाई जाती हैं , कंसोल ।MAKEDEV

No यह वास्तव में लिनक्स के तहत सच नहीं है, लेकिन यह विस्तार केवल डिवाइस ड्राइवर लेखकों के लिए मायने रखता है।


धन्यवाद! "एक डिवाइस फ़ाइल का अर्थ इसके नंबर से निर्धारित होता है", क्या आप इसका मतलब है कि फाइल डिस्क्रिप्टर है?
टिम

@ समय: नहीं, नंबर ls -lलिस्टिंग में दिखाई देते हैं, जहाँ आप आम तौर पर फ़ाइल का आकार पाते हैं, तारीख से पहले, जैसे brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ यह डिवाइस प्रमुख 8 है, मामूली 0. डिवाइस नंबर व्यवहार में अक्सर नहीं आते हैं, मैंने अभी उन्हें कहने के लिए उल्लेख किया है क्या एक डिवाइस को एक डिवाइस बनाता है (सबसे महत्वपूर्ण बात, यह फ़ाइल नाम नहीं है)। एक फाइल डिस्क्रिप्टर नंबर का एक विशेष प्रक्रिया में केवल एक अर्थ होता है।
गिल्स एसओ- बुराई को रोकना '

नहीं, लिनक्स पर ओपनिंग /dev/stdin(=> /proc/self/fd/0) मानक इनपुट को डुप्लिकेट करने के समान प्रभाव नहीं है। अंतर देखने के लिए su - non_root_user, फिर exec 5</dev/stdin"अनुमति अस्वीकृत" के साथ विफल हो जाएगा, लेकिन exec 5<&0सफल होगा। और यह न केवल नया fd अलग झंडे के साथ खोला जाएगा, फ़ाइल ऑब्जेक्ट के बारे में सब कुछ ( POSIX लिंगो में "ओपन फाइल डिस्क्रिप्शन tion ") अलग होगा (फाइल पॉइंटर ऑफसेट, नॉन / ब्लॉकिंग मोड, आदि)।
मोसवी

14
  1. हां - या तो सीधे या सहानुभूति के रूप में - यही वह चीज /dev/है जिसके लिए है।
  2. विभिन्न प्रयोजनों के लिए: कभी-कभी नामकरण योजनाओं के बीच संगतता के लिए, कभी-कभी यह काम के माहौल के लिए आवश्यक है - जैसा कि उदाहरण में /dev/stdin। यह सांख्यिकीय रूप से या किसी अन्य के लिए इंगित नहीं करता है - बस दूसरे टर्मिनल पर स्विच करें और आप देखेंगे। आपके वर्तमान टर्मिनल सत्र का मानक इनपुट है । यह भी एक उदाहरण है कि इसे सिमिलिंक होने की आवश्यकता क्यों है।/dev/pts/2/dev/stdin
  3. देखें man mknodऔर info coreutils 'mknod invocation'। सामान्य तौर पर, cएक करारा बैक्टीरिया डिवाइस प्रकार के लिए खड़ा है।

3
"आपके वर्तमान टर्मिनल सत्र का मानक इनपुट" थोड़ा अस्पष्ट है। /dev/stdinप्रक्रिया के मानक इनपुट को संदर्भित करता है जो इसे खोल देगा। सब कुछ /proc/$pidप्रक्रिया पर निर्भर डेटा है, और /proc/selfप्रक्रिया के अपने डेटा की ओर इशारा करते हुए एक प्रकार का जादू सिम्बल है।
स्टीफन जिमेनेज़

11

आपके पहले प्रश्न के लिए, वे फाइल डिस्क्रिप्टर नहीं हैं, वे डिवाइस फाइल हैं। (उर्फ "देव नोड्स")

उन फ़ाइलों को ड्राइवर के साथ बांधा जाता है जो प्रमुख और मामूली संख्याओं का उपयोग करके डिवाइस को संभाल रहे हैं। (उदाहरण के लिए, आपके lsआउटपुट में "136, 2" प्रमुख संख्या 136 के लिए बाध्य डिवाइस ड्राइवर को संदर्भित करता है, और उस ड्राइवर द्वारा नियंत्रित डिवाइस # 2 को निर्दिष्ट करता है।)

ls -lडिवाइस फ़ाइलों के मामले में आउटपुट का पहला अक्षर डिवाइस का प्रकार है। यदि यह 'c' है, तो यह एक कैरेक्टर डिवाइस है, या यदि यह 'b' है, तो यह एक ब्लॉक डिवाइस है।

अपने दूसरे प्रश्न के लिए, rozcietrzewiacz द्वारा उपरोक्त उत्तर देखें।


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