इसका क्या मतलब है कि प्रत्येक प्रक्रिया में एक वर्तमान निर्देशिका है?


10

मैं "यूनिक्स प्रोग्रामिंग पर्यावरण" पढ़ रहा हूं, लेकिन मैं प्रक्रिया की वर्तमान वर्तमान अवधारणा को समझ नहीं पाता हूं ।

प्रत्येक प्रक्रिया में, एक वर्तमान निर्देशिका होती है , और सभी फ़ाइलनामों को स्पष्ट रूप से उस निर्देशिका के नाम से शुरू किया जाता है, जब तक कि वे सीधे स्लैश के साथ शुरू न हों।

क्या इसका मतलब है कि हर प्रक्रिया में एक संकेत है कि यह किस निर्देशिका में बनाया गया था? उदाहरण के लिए, यदि प्रोग्राम /bin/sedसे इनवॉइस किया गया था /home/rene, तो इनवोकिंग सेड से जो प्रक्रिया बनाई गई थी, उसमें वर्तमान निर्देशिका है /home/rene?

जवाबों:


13

वैचारिक स्तर

जब आप अपने शेल से एक प्रक्रिया शुरू करते हैं, तो प्रक्रिया की वर्तमान कार्यशील निर्देशिका आपके शेल की वर्तमान कार्यशील निर्देशिका के समान होती है। शेल के संदर्भ में, वर्तमान कार्यशील निर्देशिका वह स्थान है जो आप वर्तमान में "पर" हैं।

किसी भी प्रक्रिया की वर्तमान कार्यशील निर्देशिका का उपयोग रिश्तेदार रास्तों की व्याख्या के लिए किया जाता है। उदाहरण के लिए, यदि आपका खोल के वर्तमान कार्यशील निर्देशिका था /home/reneऔर तुम भाग गया ls ..खोल से, प्रक्रिया के वर्तमान कार्यशील निर्देशिका, /home/rene, संकल्प करने के लिए इस्तेमाल किया जाएगा ..करने के लिए /home

आप अपने सिस्टम पर चलने वाली सभी प्रक्रियाओं की वर्तमान कार्यशील निर्देशिका देख सकते हैं lsof | grep '\scwd\s'(ध्यान दें कि आपको संभवतः उन उपयोगकर्ताओं की प्रक्रियाओं को देखने के लिए रूट होने की आवश्यकता होगी।) इससे आप अंदाजा लगा सकते हैं कि वर्तमान कार्य निर्देशिकाएँ किस प्रकार संबंधित हैं। आपके सिस्टम पर चल रही प्रक्रियाएं।

कार्यक्रम का स्तर

शेल की वर्तमान कार्यशील निर्देशिका वह निर्देशिका है जिसे आप शेल-इन pwdऔर cdक्रमशः शेल के साथ देखते और संशोधित करते हैं। ये कमांड कॉल सिस्टम कॉल जैसे कि getcwdऔर chdirआपके शेल की वर्तमान कार्यशील निर्देशिका के साथ काम करते हैं।

bashएक उदाहरण के रूप में उपयोग करते हुए , cdअंत में अंतर्निहित यह रेखा चलती है:

if (chdir (nolinks ? newdir : tdir) == 0)

और pwdअंत में इस लाइन को चलाता है:

the_current_working_directory = getcwd (0, PATH_MAX);

शेल वर्तमान कार्यशील निर्देशिका के उपयोग का एक सुविधाजनक उदाहरण है; ये समान सिस्टम कॉल अन्य कार्यक्रमों द्वारा भी उपयोग किए जाते हैं। एक प्रोग्राम अपनी वर्तमान कार्यशील निर्देशिका को बदल सकता है /usrऔर किसी भी रिश्तेदार पथ को, जो प्रोग्राम का उपयोग करता है, /usrनिर्देशिका से शुरू होगा ,

कर्नेल स्तर

प्रक्रिया की वर्तमान कार्यशील निर्देशिका कर्नेल द्वारा संग्रहीत की जाती है। लिनक्स इसे pwdएक fs_structके fsसदस्य द्वारा इंगित के सदस्य में संग्रहीत करता है task_structpwdसदस्य एक है pathstruct, जो माउंट के बारे में जानकारी के लिए अंक ( vfsmount) और फाइल सिस्टम में निर्देशिका का स्थान ( dentry)। प्रत्येक प्रक्रिया इसके task_structसाथ जुड़ी हुई है।

chdirऔर getcwdसिस्टम कॉल को संशोधित करने और में जानकारी पुनः प्राप्त pwd


इसके अतिरिक्त, कर्नेल स्तर के लिए यह याद रखना उपयोगी है कि जब एक सिस्टम कॉल किया जाता है, तो 'वर्तमान' कार्य के लिए एक पॉइंटर उपलब्ध होता है - इसलिए वर्तमान प्रक्रिया की ओर से 'कोड निष्पादित किया जाता है'। : fs_struct वर्तमान task_struct सूचक के माध्यम से पहुँचा जा सकता है elixir.free-electrons.com/linux/v4.12.4/source/fs/...
Dmitrii एस

1

प्रत्येक प्रक्रिया में एक वर्तमान कामकाजी निर्देशिका (CWD) होती है जिसे वह शुरू होने पर सौंपा जाता है। किसी प्रक्रिया के लिए कार्यशील निर्देशिका का पता लगाने के लिए आप निम्न कार्य कर सकते हैं।

प्रक्रिया के PID का पता लगाने के लिए ps aux पर दौड़ें:

$ pgrep cupsd
24532

एक PID: 24532 की वर्तमान कार्यशील निर्देशिका का पता लगाने के लिए

$ sudo pwdx 24532
24532: /

तो प्रक्रिया (PID: 24532) का CWD है /

यहाँ एक और उदाहरण है:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

इस बार नींद की प्रक्रिया (PID: 15988) मेरे घर निर्देशिका के लिए CWD सेट है /home/sam,।

आप ls -lकमांड भी चला सकते हैं :

$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /

-या-

$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam

यहां आप उन प्रक्रियाओं के लिए फिर से CWD देख सकते हैं, /और /home/sam

संदर्भ

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