यह समझना महत्वपूर्ण है कि हर प्रक्रिया का पर्यावरण चर का अपना सेट होता है।
एक प्रक्रिया की आवश्यकता होने पर fork()
सिस्टम कॉल, एक दूसरे की प्रक्रिया ( बच्चे ) पहली (के समान माता-पिता ) बनाया जाता है (इस प्रतिलिपि वातावरण है, जो या सिर्फ ढेर के ऊपर रहता है (बस नीचे दिए गए, निर्भर करता है कि आप ढेर के बारे में सोच भी शामिल है :-)
- लेकिन यूनिक्स / लिनक्स में स्टैक उच्च पतों से नीचे बढ़ता है )।
आमतौर पर, बच्चे की प्रक्रिया फिर execve()
सिस्टम कॉल को कॉल करेगी, जो अपनी (आभासी) मेमोरी में सब कुछ फेंक देगी और इसे निर्दिष्ट बाइनरी फ़ाइल में कोड और डेटा अनुभागों से फिर से संगठित करेगी ।
हालांकि, जब यह स्टैक को फिर से संगठित करता है , तो यह पर्यावरण को कॉपी करता है और तर्क तार execve()
को स्टैक पर पहले (उस क्रम में), main()
फ़ंक्शन को कॉल करने से पहले ( रिटर्न में प्रविष्टिcrt0
के बाद बूटस्ट्रैप कोड में बहुत काम किया जाता है) बाइनरी में निर्दिष्ट बिंदु ))।execve()
execve()
सी लाइब्रेरी में सिस्टम कॉल के लिए रैपर हैं जो वर्तमान वातावरण (यानी माता-पिता के वातावरण की एक प्रति) को पारित करेंगे, इसके बजाय कॉल करने वाले इसे प्रदान करेंगे (इसलिए वास्तव में बच्चा माता-पिता के वातावरण को विरासत में देगा ) - देखें environ(7)
।
चलाने की कोशिश करें (रूट के रूप में) कमांड ps axeww | less
... यह आपको सभी प्रक्रियाओं के लिए पर्यावरण दिखाएगा ! एक दिलचस्प एक प्रक्रिया आईडी 1 है (यानी init
प्रक्रिया - बूट समय पर कर्नेल द्वारा बनाई गई पहली प्रक्रिया)।
यदि आप एक विशिष्ट प्रक्रिया के लिए पर्यावरण को देखना चाहते हैं (और आप जानते हैं कि यह प्रक्रिया आईडी है), कमांड चलाने की कोशिश करें cat /proc/<PID>/environ
( <PID>
प्रक्रिया आईडी के साथ प्रतिस्थापित )।
ध्यान दें कि यदि किसी प्रक्रिया में पर्याप्त विशेषाधिकार हैं, तो यह अपने स्वयं के स्टैक को फिर से लिख सकता है, जिससे यह जानना मुश्किल हो सकता है कि इसका वातावरण क्या है - पीएस आउटपुट में आप इस तरह की कुछ डेमॉन प्रक्रियाएं देखेंगे।
लेकिन अंत में, यह सभी वफ़ल उबलता है जो @ उपोस के ऊपर कहा गया है, यदि आप अपनी शेल प्रक्रिया में एक विशिष्ट पर्यावरण चर के वर्तमान मूल्य को देखना चाहते हैं, तो बस (बिलिन) कमांड echo "$<NAME>"
( <NAME>
नाम के साथ प्रतिस्थापित ) का उपयोग करें पर्यावरण चर जो आप में रुचि रखते हैं) ... बस ध्यान रखें कि एक ही चर का एक अलग मूल्य हो सकता है, या किसी अन्य प्रक्रिया में बिल्कुल मौजूद नहीं है।
echo
यह कमांड की एक खराब पसंद है क्योंकि यह चर की सामग्री को बदल सकता है। यह शेल पैरामीटर की सामग्री को उसी नाम से आउटपुट करेगा। उदाहरण के लिए1
, बॉर्न शेल का उपयोग करना या env vars के लिए यह आवश्यक नहीं है*
। और आप env var के लिए उस दृष्टिकोण का उपयोग नहीं कर सकते हैं जिसका नाम शेल चर नाम के रूप में मान्य नहीं है।