किस प्रक्रिया के लिए `/ प्रोक / सेल्फ /` है?


40

https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-procself.html स्वयं कहते हैं

/proc/self/निर्देशिका वर्तमान में चल प्रक्रिया के लिए एक कड़ी है।

हमेशा कई प्रक्रियाएँ समवर्ती चलती हैं, इसलिए कौन सी प्रक्रिया "वर्तमान में चल रही प्रक्रिया" है?

क्या "वर्तमान में चल रही प्रक्रिया" का संदर्भ स्विचिंग को देखते हुए सीपीयू पर वर्तमान में चल रही प्रक्रिया से कोई लेना देना है?

क्या "वर्तमान में चल रही प्रक्रिया" का अग्रभूमि और पृष्ठभूमि प्रक्रियाओं से कोई लेना-देना नहीं है?


15
प्रक्रिया, जो मूल्यांकन करती है /proc/self, निश्चित रूप से।
चार्ल्स डफी

8
कौन सा व्यक्ति है मैं और मेरे को देखें?
जेफरी बोसबोम

जवाबों:


64

इसका अग्रभूमि और पृष्ठभूमि प्रक्रियाओं से कोई लेना-देना नहीं है; यह केवल वर्तमान में चल रही प्रक्रिया के साथ करना है। जब कर्नेल को "क्या /proc/selfइंगित करता है?" सवाल का जवाब देना पड़ता है , तो यह वर्तमान में वर्तमान में चलने वाली प्रक्रिया , अर्थात वर्तमान में चल रही प्रक्रिया (वर्तमान तार्किक CPU पर) को चुनता है । इसका प्रभाव यह है कि /proc/selfहमेशा पूछ रहे कार्यक्रम की ओर इशारा करता है; अगर तुम दौड़ो

ls -l /proc/self

आप देखेंगे lsकी पीआईडी, यदि आप कोड जो का उपयोग करता है लिखने /proc/selfकि कोड का अपना पीआईडी, आदि देखेंगे


13
यह एक अर्थ में "सटीक" है, लेकिन उस व्यक्ति के लिए सार्थक नहीं है जो "वर्तमान" की कर्नेल अवधारणा को नहीं समझता है। एक बेहतर जवाब होगा कि यह प्रक्रिया है प्रणाली कॉल करने के साथ /proc/selfअपने तर्कों में से एक में पथ नाम के हिस्से के रूप।
आर ..

1
@ आर .. यही ilkachachu का जवाब पर प्रकाश डाला गया है, कि एक - मैं किया उत्थान के लिए स्वतंत्र महसूस हो रहा है।
स्टीफन किट

36

वह जो सिम्लिंक (उस पर एक पथ पर रीडलिंक () या खुले () कॉल को एक्सेस करता है)। यह उस समय सीपीयू पर चल रहा होगा, लेकिन यह प्रासंगिक नहीं है। एक मल्टीप्रोसेसर सिस्टम एक साथ सीपीयू पर कई प्रक्रियाएं कर सकता है।

फोरग्राउंड और बैकग्राउंड प्रोसेस ज्यादातर एक शेल कंस्ट्रक्शन होते हैं, और इसमें कोई अद्वितीय अग्रभूमि प्रक्रिया नहीं होती है, क्योंकि सिस्टम पर सभी शेल सत्र एक होंगे।


27

शब्दांकन बेहतर हो सकता था, लेकिन फिर आप आत्म संदर्भ के विचार को व्यक्त करने के लिए रचना करने की कोशिश करने वाले किसी भी शब्द को भ्रमित करने वाले हैं। निर्देशिका का नाम मेरी राय में अधिक वर्णनात्मक है।

मूल रूप से, /proc/self/उस प्रक्रिया का प्रतिनिधित्व करता है जो पढ़ रही है /proc/self/। इसलिए यदि आप /proc/self/C प्रोग्राम से खोलने का प्रयास करते हैं तो यह उस प्रोग्राम का प्रतिनिधित्व करता है। यदि आप इसे शेल से करने की कोशिश करते हैं तो यह शेल आदि है।

लेकिन क्या होगा अगर आपके पास एक क्वाड कोर सीपीयू है जो 4 प्रक्रियाओं को एक साथ चलाने में सक्षम है, असली के लिए, मल्टीटास्किंग के लिए नहीं?

फिर प्रत्येक प्रक्रिया /proc/self/एक दूसरे को देखने में सक्षम हुए बिना वास्तविक के लिए एक अलग दिखाई देगी /proc/self/

यह कैसे काम करता है?

ठीक है, /proc/self/वास्तव में एक फ़ोल्डर नहीं है। यह एक डिवाइस ड्राइवर है जो स्वयं को एक फ़ोल्डर के रूप में उजागर करने के लिए होता है यदि आप इसे एक्सेस करने का प्रयास करते हैं। ऐसा इसलिए है क्योंकि यह फ़ोल्डर्स के लिए आवश्यक एपीआई को लागू करता है। /proc/self/निर्देशिका केवल बात यह है कि यह करता है नहीं है। दूरस्थ सर्वर या बढ़ते USB थंबड्राइव या ड्रॉपबॉक्स से साझा किए गए साझा फ़ोल्डर पर विचार करें। वे सभी एपीआई के एक ही सेट को लागू करके काम करते हैं जो उन्हें फ़ोल्डर्स की तरह व्यवहार करते हैं।

जब कोई प्रक्रिया /proc/self/डिवाइस ड्राइवर तक पहुंचने की कोशिश करती है तो वह उस प्रक्रिया के डेटा को पढ़कर गतिशील रूप से अपनी सामग्री उत्पन्न करेगा। तो फ़ाइलें /proc/self/वास्तव में मौजूद नहीं हैं। यह एक दर्पण की तरह है जो उस प्रक्रिया पर वापस प्रतिबिंबित करता है जो इसे देखने की कोशिश करता है।

क्या यह वास्तव में एक उपकरण चालक है? आपको लगता है जैसे आप चीजों की देखरेख कर रहे हैं!

हाँ, यह वास्तव में है। यदि आप पांडित्यपूर्ण होना चाहते हैं तो यह कर्नेल मॉड्यूल है। लेकिन अगर आप विभिन्न लिनक्स डेवलपर्स चैनल पर usenet पोस्टिंग की जांच करते हैं, तो अधिकांश कर्नेल डेवलपर्स "डिवाइस ड्राइवर" और "कर्नेल मॉड्यूल" का उपयोग करते हैं। मैं डिवाइस ड्राइवर्स, इरेट ... कर्नेल मॉड्यूल, लिनक्स के लिए लिखता था। यदि आप अपना स्वयं का इंटरफ़ेस लिखना चाहते /proc/हैं, तो उदाहरण के लिए कहें कि आप एक /proc/unix.stackexchange/फाइल सिस्टम चाहते हैं जो इस वेबसाइट से पोस्ट देता है जिसे आप पढ़ सकते हैं कि ओ'रेली द्वारा प्रकाशित "लिनक्स डिवाइस ड्राइवर्स" पुस्तक में इसे कैसे किया जाए। यह सॉफ्टकॉपी ऑनलाइन के रूप में भी उपलब्ध है।


6
/proc/selfएक डिवाइस ड्राइवर नहीं है, लेकिन इसके बजाय आ कर्नेल-एक्सपोज़्ड फाइलसिस्टम का हिस्सा है जिसे कहा जाता है procfs
क्रिस डाउन

1
@ क्रिसडाउन: हाँ, लेकिन इसे कर्नेल मॉड्यूल के रूप में कार्यान्वित किया जाता है - जो कि डिवाइस ड्राइवर का लिनक्स संस्करण है - /procआदरणीय पुस्तक "लिनक्स डिवाइस ड्राइवर्स" में एक आधारित ड्राइवर का एक उदाहरण कार्यान्वयन भी है । मुझे पता होना चाहिए, मैंने कॉलेज में एक लागू किया। मैं शायद "कर्नेल मॉड्यूल" शब्द का उपयोग कर सकता था, लेकिन "डिवाइस ड्राइवर" वह है जो ज्यादातर लोग परिचित हैं और मैं भ्रामक धारणा नहीं देना चाहता कि "कर्नेल मॉड्यूल" और "डिवाइस ड्राइवर" के बीच एक महत्वपूर्ण अंतर है शब्दावली से अलग।
स्लीपबेटमैन 15

7
@slebetman अच्छी तरह से, प्रत्येक सेफ़ के लिए एक मॉड्यूल नहीं है, यह केवल एक मॉड्यूल के रूप में बनाया जा सकता है। यदि आप बालों को विभाजित करना चाहते हैं, तो बालों को विभाजित करने के लिए है कि यह एक फाइलसिस्टम ड्राइवर है, न कि डिवाइस ड्राइवर
hobbs

10

यह जो भी प्रक्रिया होती है, वह एक्सेस /proc/selfया फाइलों / फ़ोल्डरों में होती है।

कोशिश करो cat /proc/self/cmdline। आपको आश्चर्य होगा, आश्चर्य होगा cat /proc/self/cmdline, (वास्तव में, एक स्थान के बजाय tऔर के बीच एक अशक्त चरित्र /होगा) क्योंकि यह बिल्ली के छद्म को एक्सेस करने वाली बिल्ली प्रक्रिया होगी।

जब आप एक करते हैं ls -l /proc/self, तो आप ls की प्रक्रिया को स्वयं देखेंगे। या कैसे के बारे में ls -l /proc/self/exe; यह एलएस निष्पादन योग्य को इंगित करेगा।

या बदलाव के लिए यह कोशिश करें:

$ cp /proc/self/cmdline /tmp/cmd
$ hexdump -C /tmp/cmd
00000000  63 70 00 2f 70 72 6f 63  2f 73 65 6c 66 2f 63 6d  |cp./proc/self/cm|
00000010  64 6c 69 6e 65 00 2f 74  6d 70 2f 63 6d 64 00     |dline./tmp/cmd.|
0000001f

या और भी

$ hexdump -C /proc/self/cmdline 
00000000  68 65 78 64 75 6d 70 00  2d 43 00 2f 70 72 6f 63  |hexdump.-C./proc|
00000010  2f 73 65 6c 66 2f 63 6d  64 6c 69 6e 65 00        |/self/cmdline.|
0000001e

जैसा कि मैंने कहा, यह जो भी हो एक्सेस /proc/selfया फाइलों / फ़ोल्डरों में होता है।


2

/ proc / स्वयं वाक्यगत शर्करा है। यह contatenating / proc / और getpid () syscall (metavariable $$ के रूप में बाश में सुलभ) के परिणाम के लिए एक शॉर्टकट है। यह शेल स्क्रिप्टिंग के मामले में भ्रामक, थओ हो सकता है, क्योंकि कई बयान अन्य प्रक्रियाओं को लागू करते हैं, स्वयं पीआईडी ​​के साथ पूर्ण ... पीआईडी ​​जो संदर्भित करते हैं, अधिक बार नहीं, मृत प्रक्रियाओं से। विचार करें:

root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan  1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan  1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593

'/ bin / ls' निर्देशिका के मार्ग का मूल्यांकन करेगा, इसे / proc / 26563 के रूप में हल करेगा, क्योंकि यह प्रक्रिया की PID है - नव निर्मित / बिन / ls प्रक्रिया - जो निर्देशिका की सामग्री को पढ़ती है। लेकिन उस समय तक पाइपलाइन में अगली प्रक्रिया, शेल स्क्रिप्टिंग के मामले में, या जब तक प्रॉम्प्ट वापस आता है, एक इंटरेक्टिव शेल के मामले में, पथ अब मौजूद नहीं है और सूचना आउटपुट एक गैर-प्रासंगिक प्रक्रिया को संदर्भित करता है।

यह केवल बाहरी आदेशों पर लागू होता है, हालांकि (जो वास्तविक निष्पादन योग्य प्रोग्राम फाइलें हैं, जैसा कि शेल में ही निर्मित होने के विपरीत है)। इसलिए, यदि आप कहते हैं, तो आपको अलग-अलग परिणाम मिलेंगे, यदि आप बाहरी सामग्री / बिन / ls के लिए पथ का नाम पास करने के बजाय निर्देशिका की सामग्री की सूची प्राप्त करने के लिए फ़ाइल नाम का उपयोग करते हैं:

root@vps01:~# ls /proc/self/fd
0  1  2  3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3

पहली पंक्ति में, शेल ने एक नई प्रक्रिया '/ / बिन / ls' को अंजाम दिया () syscall, argv [1] के रूप में "/ proc / self / fd" पास करके। '/ बिन / एलएस', बदले में, निर्देशिका / proc / स्व / fd खोला और पढ़ा, फिर मुद्रित, इसकी सामग्री के रूप में यह उन पर iterated।

दूसरी पंक्ति, हालांकि, फिल्नाम की सूची का विस्तार करने के लिए पर्दे के पीछे ग्लोब () का उपयोग करती है; इनको गूँज के रूप में पारित किया जाता है। (आमतौर पर एक आंतरिक कमांड के रूप में लागू किया जाता है, लेकिन अक्सर एक / बिन / प्रतिध्वनी बाइनरी भी होती है ... लेकिन यह वास्तव में अप्रासंगिक है, क्योंकि प्रतिध्वनि केवल तारों के साथ काम कर रही है जो पथ नामों से संबंधित किसी भी syscall को कभी नहीं खिलाती है।)

अब, निम्नलिखित मामले पर विचार करें:

root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0  1  2  255

यहां, शेल, / बिन / एलएस की मूल प्रक्रिया , ने अपनी वर्तमान निर्देशिका को / proc / self की उपनिर्देशिका बना दिया है । इस प्रकार, सापेक्ष मार्ग का मूल्यांकन उसके दृष्टिकोण से किया जाता है। मेरा सबसे अच्छा अनुमान यह है कि यह POSIX फाइल शब्दार्थ से संबंधित है जहां आप किसी भी फाइल के लिए कई हार्ड लिंक बना सकते हैं, जिसमें कोई भी ओपन फाइल डिस्क्रिप्टर शामिल है। तो इस बार, / बिन / ls समान रूप से प्रतिध्वनि / proc / $ $ / fd / * व्यवहार करता है।


-2

जैसा कि शेल अलग-अलग प्रक्रियाओं में ls जैसे कार्यक्रमों को आमंत्रित करता है, / proc / self nnnnn के लिए एक सिमलिंक के रूप में दिखाई देगा , जहां nnnnn ls प्रक्रिया की आईडी है। जहाँ तक मुझे पता है, आमतौर पर इस्तेमाल किए जाने वाले गोले में सिम्बलिंक पढ़ने के लिए कोई बेसिन नहीं है, लेकिन पर्ल में है:

perl -e 'प्रिंट "/ proc / self लिंक:", रीडलिंक ("/ proc / self"), "- $ $ $ \ n"; "

इसलिए / proc / self एक सिम्लिंक के रूप में व्यवहार करता है, लेकिन procfs फाइल सिस्टम इसे "जादुई" प्रक्रिया-जागरूक बनाता है।

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