जवाबों:
जब भी आप किसी फ़ाइल के नीचे पढ़ते हैं /proc
, तो यह कर्नेल में कुछ कोड को आमंत्रित करता है जो पाठ को फ़ाइल सामग्री के रूप में पढ़ने के लिए गणना करता है। तथ्य यह है कि मक्खी पर सामग्री उत्पन्न होती है, यह बताती है कि लगभग सभी फाइलों का समय अब तक रिपोर्ट किया गया है और उनके आकार को 0 के रूप में रिपोर्ट किया गया है - यहां आपको 0 को "पता नहीं" के रूप में पढ़ना चाहिए। सामान्य फाइलसिस्टम के विपरीत, फाइलसिस्टम, जिस पर आरोहित किया /proc
जाता है , जिसे procfs कहा जाता है , एक डिस्क या अन्य स्टोरेज मीडिया (जैसे FAT, ext2, zfs,…) से डेटा लोड नहीं करता है या नेटवर्क पर (जैसे NFS, सांबा,…) और उपयोगकर्ता कोड ( FUSE के विपरीत ) को कॉल नहीं करता है ।
अधिकांश गैर-बीएसडी यूनियनों में प्रोकैट्स मौजूद है। इसने UNIX 8 वें संस्करण में एटी एंड टी के बेल लैब्स में अपने जीवन की शुरुआत प्रक्रियाओं के बारे में जानकारी देने के तरीके के रूप में की थी (और ps
अक्सर पढ़ी गई जानकारी के लिए एक बहुत-प्रिंटर है /proc
)। अधिकांश procfs कार्यान्वयन में एक फ़ाइल या निर्देशिका होती है जिसे /proc/123
PID 123 के साथ प्रक्रिया के बारे में जानकारी देने के लिए बुलाया जाता है। लिनक्स खरीद फाइल सिस्टम को कई और प्रविष्टियों के साथ विस्तारित करता है जो आपके उदाहरण सहित सिस्टम की स्थिति की रिपोर्ट करते हैं /proc/cpuinfo
।
अतीत में, लिनक्स /proc
ने विभिन्न फाइलों का अधिग्रहण किया जो ड्राइवरों के बारे में जानकारी प्रदान करते हैं, लेकिन यह उपयोग अब इसके पक्ष में पदावनत हो गया है /sys
, और /proc
अब धीरे-धीरे घूमता है। प्रविष्टियां पसंद हैं /proc/bus
और /proc/fs/ext4
जहां वे पिछड़ी संगतता के लिए हैं, लेकिन नए समान इंटरफेस के तहत बनाई गई हैं /sys
। इस उत्तर में, मैं लिनक्स पर ध्यान केंद्रित करूँगा।
/proc
लिनक्स पर प्रलेखन के लिए आपकी पहली और दूसरी प्रविष्टि बिंदु हैं:
proc(5)
आदमी पृष्ठ ;/proc
फाइल सिस्टम में गिरी प्रलेखन ।आपका तीसरा प्रवेश बिंदु, जब प्रलेखन इसे कवर नहीं करता है, तो स्रोत को पढ़ रहा है । आप अपनी मशीन पर स्रोत डाउनलोड कर सकते हैं, लेकिन यह एक बहुत बड़ा कार्यक्रम है, और एलएक्सआर , लिनक्स क्रॉस-रेफरेंस, एक बड़ी मदद है। (LXR के कई वेरिएंट हैं, जो चल रहा lxr.linux.no
है वह अब तक सबसे अच्छा है लेकिन दुर्भाग्य से साइट अक्सर नीचे है।) C का थोड़ा ज्ञान आवश्यक है, लेकिन आपको रहस्यमयी मूल्य को ट्रैक करने के लिए प्रोग्रामर होने की आवश्यकता नहीं है। ।
/proc
प्रविष्टियों की मुख्य हैंडलिंग fs/proc
निर्देशिका में है। कोई भी ड्राइवर इसमें प्रविष्टियाँ दर्ज कर सकता है /proc
(हालाँकि जैसा कि ऊपर दर्शाया गया है कि यह अब उसके पक्ष में पदावनत हो गया है /sys
), इसलिए यदि आपको वह नहीं मिल रहा है जिसकी आप तलाश कर रहे हैं fs/proc
, तो हर जगह देखें। में घोषित किए गए ड्राइवर कॉल फ़ंक्शन include/linux/proc_fs.h
। 3.9 तक कर्नेल संस्करण फ़ंक्शन प्रदान करते हैं create_proc_entry
और कुछ रैपर (विशेष रूप से create_proc_read_entry
), और कर्नेल संस्करण 3.10 और इसके बाद के संस्करण केवल proc_create
और proc_create_data
(और कुछ और) प्रदान करते हैं ।
/proc/cpuinfo
एक उदाहरण के रूप में लेते हुए , एक खोज "cpuinfo"
आपको कॉल को proc_create("cpuinfo, …")
अंदर ले जाती है fs/proc/cpuinfo.c
। आप देख सकते हैं कि कोड बहुत अधिक बॉयलरप्लेट कोड है: चूंकि अधिकांश फाइलें /proc
केवल कुछ पाठ डेटा को डंप करती हैं, ऐसा करने के लिए सहायक कार्य हैं। केवल एक seq_operations
संरचना है, और असली मांस cpuinfo_op
डेटा संरचना में है, जो वास्तुकला-निर्भर है, आमतौर पर arch/<architecture>/kernel/setup.c
(या कभी-कभी एक अलग फ़ाइल) में परिभाषित किया जाता है । एक उदाहरण के रूप में x86 लेते हुए, हम नेतृत्व कर रहे हैं arch/x86/kernel/cpu/proc.c
। वहाँ मुख्य कार्य हैshow_cpuinfo
, जो वांछित फ़ाइल सामग्री को प्रिंट करता है; बाकी इन्फ्रास्ट्रक्चर वहाँ डेटा को पढ़ने की प्रक्रिया में फ़ीड करने के लिए है जिस गति से यह अनुरोध करता है। आप कर्नेल में विभिन्न चर में डेटा से मक्खी पर इकट्ठा किए जा रहे डेटा को देख सकते हैं, जिसमें सीपीयू आवृत्ति जैसे मक्खी पर गणना की गई कुछ संख्याएं भी शामिल हैं ।
का एक बड़ा हिस्सा /proc
प्रति-प्रक्रिया की जानकारी है /proc/<PID>
। इन प्रविष्टियों को सरणीfs/proc/base.c
में पंजीकृत किया गया है ; यहां पंजीकृत कुछ फ़ंक्शन अन्य फ़ाइलों में परिभाषित किए गए हैं। आइए कुछ उदाहरण देखें कि ये प्रविष्टियाँ कैसे उत्पन्न होती हैं:tgid_base_stuff
cmdline
proc_pid_cmdline
उसी फ़ाइल द्वारा जनरेट किया गया है। यह प्रक्रिया में ते डेटा का पता लगाता है और इसे प्रिंट करता है।clear_refs
के विपरीत, अब तक हमने जो प्रविष्टियाँ देखी हैं, वे लिखने योग्य हैं, लेकिन पठनीय नहीं हैं। इसलिए proc_clear_refs_operations
संरचना एक clear_refs_write
फ़ंक्शन को परिभाषित करती है लेकिन कोई फ़ंक्शन नहीं पढ़ती है।cwd
एक प्रतीकात्मक लिंक (थोड़ा जादुई एक) है proc_cwd_link
, जिसके द्वारा घोषित किया गया है , जो प्रक्रिया की वर्तमान निर्देशिका को देखता है और इसे लिंक सामग्री के रूप में लौटाता है।fd
एक उपनिर्देशिका है। निर्देशिका पर संचालन स्वयं proc_fd_operations
डेटा संरचना में परिभाषित किए गए हैं (वे फ़ंक्शन को छोड़कर बॉयलरproc_readfd
हैं, जो प्रविष्टियों की गणना करते हैं , जो कि प्रक्रिया की खुली फ़ाइलों की गणना करता है) जबकि प्रविष्टियों पर संचालन `proc_fd_inode_operations 'में होते हैं ।का एक अन्य महत्वपूर्ण क्षेत्र /proc
है /proc/sys
, जो एक सीधा इंटरफ़ेस है sysctl
। इस पदानुक्रम में एक प्रविष्टि से पढ़ना संबंधित sysctl मान का मान लौटाता है, और लेखन sysctl मान सेट करता है। Sysctl के लिए प्रवेश बिंदु हैं fs/proc/proc_sysctl.c
। Sysctls के पास register_sysctl
और दोस्तों के साथ अपनी पंजीकरण प्रणाली है ।
जब आपके सबसे अच्छे दोस्त पर्दे के पीछे किस तरह का जादू हो रहा है, यह जानने की कोशिश कर रहा है strace
। इस उपकरण को संचालित करना सीखना सबसे अच्छी चीजों में से एक है जिसे आप पर्दे के पीछे पागल जादू के लिए एक बेहतर प्रशंसा प्राप्त करने के लिए कर सकते हैं।
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
उपरोक्त आउटपुट से आप देख सकते हैं कि /proc/cpuinfo
यह केवल एक नियमित फ़ाइल है, या कम से कम एक प्रतीत होता है। तो चलो गहरी खुदाई करें।
फ़ाइल को देखते हुए यह "बस एक फ़ाइल" प्रतीत होगी।
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
लेकिन करीब से देखिए। हम अपना पहला संकेत प्राप्त करते हैं कि इसका विशेष, ध्यान दें कि फ़ाइल का आकार 0 बाइट्स है।
# 2 - स्टेट के साथ ।।यदि हम अब फ़ाइल का उपयोग stat
करते हुए देखते हैं तो हम अपना अगला संकेत प्राप्त कर सकते हैं कि कुछ खास बात है /proc/cpuinfo
।
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
# 2 चलाएं
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
एक्सेस, संशोधित करें, और परिवर्तन समय पर ध्यान दें? वे प्रत्येक पहुंच के लिए बदलते रहते हैं। यह अत्यधिक असामान्य है कि सभी 3 उसी तरह बदल जाएंगे। जब तक किसी फ़ाइल की टाइमस्टैम्प विशेषताओं को संपादित नहीं किया जाता है, तब तक वही रहता है।
# 3 - फ़ाइल के साथ ..अभी तक एक और सुराग है कि यह फ़ाइल कुछ भी है लेकिन एक नियमित फ़ाइल है:
$ file /proc/cpuinfo
/proc/cpuinfo: empty
यदि यह नामित पाइप की कुछ अभिव्यक्तियाँ होती हैं, तो यह इन फ़ाइलों में से एक के समान होगी:
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
यदि हम एक स्पर्श करते हैं emptyfile
, /proc/cpuinfo
तो एक फ़ाइल की तरह अधिक दिखाई देता है तो एक पाइप:
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
# 4 - माउंट के साथ ।।
तो इस बिंदु पर हमें एक कदम वापस लेने और थोड़ा बाहर ज़ूम करने की आवश्यकता है। हम एक विशेष फ़ाइल को देख रहे हैं, लेकिन शायद हमें उस फ़ाइल सिस्टम पर देखना चाहिए, जिस पर यह फ़ाइल रहती है। और इसके लिए हम mount
कमांड का उपयोग कर सकते हैं ।
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
ठीक है, इसलिए फाइलसिस्टम टाइप प्रकार का है proc
। तो /proc
एक अलग फाइलसिस्टम प्रकार है, यह हमारा संकेत है कि अंडर फाइल्स /proc
विशेष हैं। वे केवल मिल फ़ाइलों के आपके रन नहीं हैं। तो चलिए पता करते हैं कि proc
फाइलसिस्टम को विशेष बनाने के बारे में कुछ और जानकारी ।
एक नज़र रखना mount
:
Proc फाइलसिस्टम एक विशेष उपकरण से जुड़ा नहीं है, और जब इसे बढ़ते हैं, तो एक मनमाना कीवर्ड, जैसे कि डिवाइस विनिर्देशन के बजाय खरीद का उपयोग किया जा सकता है। (प्रथागत पसंद कोई भी कम भाग्यशाली नहीं है: उमाउंट से त्रुटि संदेश `कोई भी व्यस्त 'भ्रामक हो सकता है।)
और अगर हम proc
मैन पेज देखें:
Proc फाइल सिस्टम एक छद्म फाइल सिस्टम है जिसका उपयोग कर्नेल डेटा स्ट्रक्चर्स के इंटरफेस के रूप में किया जाता है। यह आमतौर पर / खरीद पर मुहिम शुरू की जाती है। अधिकांश यह केवल पढ़ने के लिए है, लेकिन कुछ फाइलें कर्नेल चर को बदलने की अनुमति देती हैं।
उसी आदमी पृष्ठ में थोड़ा और नीचे:
/ Proc / cpuinfo
यह सीपीयू और सिस्टम आर्किटेक्चर पर निर्भर वस्तुओं का एक संग्रह है, प्रत्येक समर्थित आर्किटेक्चर के लिए एक अलग सूची। दो सामान्य प्रविष्टियाँ प्रोसेसर हैं जो सीपीयू नंबर और बोगोमिप्स देती हैं; एक प्रणाली स्थिरांक जिसे कर्नेल आरंभीकरण के दौरान गणना की जाती है। एसएमपी मशीनों में प्रत्येक सीपीयू की जानकारी होती है। Lscpu (1) कमांड इस फ़ाइल से अपनी जानकारी एकत्र करता है।
मैन पेज के निचले भाग में एक कर्नेल डॉक्यूमेंट का सन्दर्भ है, जिसे आप यहाँ पा सकते हैं, जिसका शीर्षक है: THE / proc FILESYSTEM । उस दस्तावेज़ से उद्धरण:
खरीद फ़ाइल सिस्टम कर्नेल में आंतरिक डेटा संरचनाओं के लिए एक इंटरफ़ेस के रूप में कार्य करता है। इसका उपयोग सिस्टम के बारे में जानकारी प्राप्त करने और रनटाइम (sysctl) पर कुछ कर्नेल मापदंडों को बदलने के लिए किया जा सकता है।
तो हमने यहाँ क्या सीखा? अच्छी तरह से दिया गया है कि /proc
एक छद्म फाइलसिस्टम के रूप में संदर्भित किया जाता है और एक "आंतरिक डेटा संरचनाओं के लिए इंटरफ़ेस" भी संभवत: यह मान लेना सुरक्षित है कि इसके भीतर की वस्तुएं वास्तविक फाइलें नहीं हैं , बल्कि केवल फाइलों की तरह दिखने वाली अभिव्यक्तियां हैं, लेकिन वास्तव में नहीं हैं।
मैं इस उद्धरण के साथ बंद करूँगा जो जाहिरा तौर पर man 5 proc
लगभग 2004 से पूर्व संस्करण में हुआ करता था, लेकिन जो भी कारण अब शामिल नहीं है। नोट: मुझे यकीन नहीं है कि इसे हटा दिया गया था क्योंकि यह बहुत अच्छी तरह से वर्णन करता /proc
है:
GNU / Linux सिस्टम पर / proc निर्देशिका, कर्नेल को इंटरफ़ेस जैसी फाइल-प्रणाली प्रदान करता है। यह एप्लिकेशन और उपयोगकर्ताओं को सामान्य फ़ाइल-सिस्टम I / O ऑपरेशन का उपयोग करके कर्नेल में जानकारी सेट करने और मान सेट करने की अनुमति देता है।
खरीद फ़ाइल सिस्टम को कभी-कभी प्रक्रिया सूचना छद्म फ़ाइल सिस्टम के रूप में संदर्भित किया जाता है। इसमें `` वास्तविक '' फाइलें नहीं हैं, बल्कि रनटाइम सिस्टम की जानकारी (जैसे सिस्टम मेमोरी, डिवाइस माउंटेड, हार्डवेयर कॉन्फ़िगरेशन, आदि) हैं। इस कारण से इसे कर्नेल के लिए एक नियंत्रण और सूचना केंद्र माना जा सकता है। वास्तव में, काफी सिस्टम यूटिलिटीज इस निर्देशिका में फाइलों के लिए कॉल हैं। उदाहरण के लिए, कमांड लेस्मोड, जो कर्नेल द्वारा लोड किए गए मॉड्यूल को सूचीबद्ध करता है, मूल रूप से lspci के समान 'कैट / प्रोक / मॉड्यूल' है, जो सिस्टम के PCI बस से जुड़े उपकरणों को सूचीबद्ध करता है, जो 'cat /' के समान है। proc / पीसीआई '। इस निर्देशिका में स्थित फ़ाइलों को बदलकर आप कर्नेल पैरामीटर बदल सकते हैं जब सिस्टम चल रहा है।
स्रोत: proc छद्म फ़ाइल-सिस्टम
strace -o catcpuproc.txt cat /proc/cpuinfo
@ एसएलएम द्वारा दिया गया उत्तर बहुत व्यापक है, लेकिन मुझे लगता है कि एक सरल व्याख्या परिप्रेक्ष्य में बदलाव से आ सकती है।
दिन-प्रतिदिन के उपयोग में हम फ़ाइलों को भौतिक चीजों के रूप में सोच सकते हैं, अर्थात। कुछ डिवाइस पर संग्रहीत डेटा का हिस्सा। यह / proc / cpuinfo जैसी फ़ाइलों को बहुत रहस्यमय और भ्रमित करता है। हालाँकि, यह बिल्कुल सही समझ में आता है अगर हम फ़ाइलों को इंटरफ़ेस के रूप में समझते हैं ; कुछ प्रोग्राम में डेटा को अंदर और बाहर भेजने का तरीका।
इस तरह से डेटा भेजने और प्राप्त करने वाले प्रोग्राम फाइलसिस्टम या ड्राइवर हैं (आप इन शब्दों को कैसे परिभाषित करते हैं, इस पर निर्भर करता है, जो कि बहुत व्यापक हो सकता है या परिभाषा को बहुत कम कर सकता है)। महत्वपूर्ण बिंदु यह है कि इनमें से कुछ प्रोग्राम इस इंटरफ़ेस के माध्यम से भेजे गए डेटा को संग्रहीत और पुनर्प्राप्त करने के लिए एक हार्डवेयर डिवाइस का उपयोग करते हैं; लेकिन सब नहीं।
फाइलसिस्टम के कुछ उदाहरण जो स्टोरेज डिवाइस का उपयोग नहीं करते हैं (कम से कम सीधे):
Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) एक सामान्य प्रोग्रामिंग इंटरफ़ेस के रूप में फ़ाइलों का उपयोग करने का एक चरम उदाहरण है।