यह वास्तव में बहुत सरल है, कम से कम यदि आपको कार्यान्वयन विवरण की आवश्यकता नहीं है।
लिनक्स पर सबसे पहले, सभी फाइल सिस्टम (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) कर्नेल में लागू किए जाते हैं। कुछ लोग FUSE के माध्यम से उपयोगकर्ता कोड के लिए काम करना बंद कर सकते हैं, और कुछ केवल कर्नेल मॉड्यूल के रूप में आते हैं ( देशी ZFS लाइसेंसिंग प्रतिबंधों के कारण उत्तरार्द्ध का एक उल्लेखनीय उदाहरण है), लेकिन या तो वहाँ एक कर्नेल घटक बना हुआ है। यह एक महत्वपूर्ण मूल है।
जब कोई प्रोग्राम किसी फ़ाइल से पढ़ना चाहता है, तो यह विभिन्न सिस्टम लाइब्रेरी कॉल जारी करेगा जो अंत में कर्नेल के रूप में समाप्त होता है open(), read(), close() अनुक्रम (संभवतः के साथ seek() अच्छे उपाय के लिए फेंका गया)। कर्नेल प्रदान किए गए पथ और फ़ाइल नाम को लेता है, और फ़ाइल सिस्टम और डिवाइस I / O लेयर के माध्यम से इन्हें भौतिक रीड रिक्वेस्ट में अनुवाद करता है (और कई मामलों में रिक्वेस्ट भी लिखता है - उदाहरण के लिए atime अपडेट के लिए) कुछ अंतर्निहित मेमोरी में।
हालाँकि, इसमें उन अनुरोधों का विशेष रूप से अनुवाद नहीं करना है शारीरिक, लगातार भंडारण । कर्नेल का अनुबंध यह है कि सिस्टम कॉल के उस विशेष सेट को जारी करना विचाराधीन फ़ाइल की सामग्री प्रदान करें । जहां वास्तव में हमारे भौतिक क्षेत्र में "फाइल" मौजूद है, यह इसके लिए गौण है।
पर /proc आम तौर पर घुड़सवार के रूप में जाना जाता है procfs। यह एक विशेष फ़ाइल सिस्टम प्रकार है, लेकिन चूंकि यह एक फ़ाइल सिस्टम है, इसलिए यह वास्तव में उदा से अलग नहीं है। एक ext3 फ़ाइल सिस्टम कहीं घुड़सवार। तो यह अनुरोध उन सभी फाइल और निर्देशिकाओं के बारे में पता करने के लिए, जिसे सिस्टम फाइल कोड ड्राइवर कोड के लिए पास कर दिया जाता है और कर्नेल डेटा संरचनाओं से जानकारी के विशेष टुकड़े लौटाता है ।
इस मामले में "संग्रहण परत" कर्नेल डेटा संरचना है, और procfs उन तक पहुँचने के लिए एक स्वच्छ, सुविधाजनक इंटरफ़ेस प्रदान करता है। ध्यान रखें कि बढ़ते प्रोक्योरमेंट्स /proc बस सम्मेलन है; आप इसे आसानी से कहीं और माउंट कर सकते हैं। वास्तव में, ऐसा कभी-कभी किया जाता है, उदाहरण के लिए चुरोट जेल में जब वहां चल रही प्रक्रिया को किसी कारण से / खरीद की आवश्यकता होती है।
यदि आप किसी फ़ाइल पर मान लिखते हैं तो यह उसी तरह काम करता है; कर्नेल स्तर पर, की एक श्रृंखला में अनुवाद करता है open(), seek(), write(), close() कॉल जो फिर से फाइल सिस्टम ड्राइवर के पास जाती है; फिर से, इस विशेष मामले में, कोड की घोषणा करता है।
विशेष कारण आप देखते हैं file लौटने empty यह है कि procfs द्वारा उजागर की गई फ़ाइलों में से कई उजागर हैं 0 बाइट्स का आकार। 0 बाइट का आकार संभवतः कर्नेल साइड पर एक ऑप्टिमाइज़ेशन है (कई फाइलें / प्रॉप डायनेमिक हैं और आसानी से लंबाई में भिन्न हो सकती हैं, संभवत: एक रीडिंग से दूसरे में भी, और प्रत्येक डायरेक्टरी रीड पर प्रत्येक फाइल की लंबाई की गणना कर सकती है। संभावित रूप से बहुत महंगा हो सकता है)। इस उत्तर के लिए टिप्पणियों द्वारा जा रहे हैं, जिन्हें आप स्ट्रेस या इसी तरह के टूल के माध्यम से चलाकर अपने सिस्टम पर सत्यापित कर सकते हैं, file पहले मुद्दे stat() किसी भी विशेष फ़ाइल का पता लगाने के लिए कॉल करें, और फिर अवसर लेता है, यदि फ़ाइल का आकार 0 के रूप में रिपोर्ट किया जाता है, और फ़ाइल को खाली होने के रूप में रिपोर्ट करें।
यह व्यवहार वास्तव में प्रलेखित है और हो सकता है निर्दिष्ट करके ओवरराइड किया गया -s या --special-files पर file मंगलाचरण, हालाँकि जैसा कि मैनुअल पेज में बताया गया है कि इसके साइड इफेक्ट्स हो सकते हैं। नीचे दिया गया उद्धरण बीएसडी फ़ाइल 5.11 मैन पेज, दिनांक 17 अक्टूबर 2011 से है।
आम तौर पर, फ़ाइल केवल तर्क फ़ाइलों के प्रकार को पढ़ने और निर्धारित करने का प्रयास करती है जो स्टेट (2) रिपोर्ट साधारण फाइलें हैं। यह समस्याओं को रोकता है, क्योंकि विशेष फ़ाइलों को पढ़ने से अजीब परिणाम हो सकते हैं। निर्दिष्ट कर रहा है -s विकल्प फ़ाइल को तर्क फ़ाइलों को भी पढ़ने का कारण बनता है जो ब्लॉक या चरित्र विशेष फाइलें हैं। यह कच्चे डिस्क विभाजन में डेटा के फाइल सिस्टम प्रकार को निर्धारित करने के लिए उपयोगी है, जो विशेष फाइलों को ब्लॉक करते हैं। इस विकल्प के कारण फ़ाइल का आकार नापने का भी कारण बनता है जैसा कि स्टेट ने रिपोर्ट किया था (2) चूंकि कुछ प्रणालियों पर यह कच्चे डिस्क विभाजन के लिए एक शून्य आकार की रिपोर्ट करता है।
strace file /proc/versionयाltrace -S /proc/versionअनुकूलन बल्कि छोटा है। यह एक करता हैstat()पहले कॉल करें और पाता है कि आकार 0 है, इस प्रकार लंघनopen()- लेकिन इससे पहले यह कई मैजिक फाइल लोड कर रहा है।