कैसे / proc / <pid> / exe symlink साधारण सीलिंक से भिन्न होता है?


23

यदि मैं एक प्रक्रिया शुरू करता हूं और फिर इसका बाइनरी हटा देता हूं, तो भी मैं इससे उबर सकता हूं /proc/<pid>/exe:

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

दूसरी ओर, यदि मैं खुद एक प्रतीकात्मक लिंक बनाता हूं, तो लक्ष्य को हटा दें और कॉपी करने का प्रयास करें:

cp: cannot stat ‘sleep’: No such file or directory

/procकर्नेल के लिए एक इंटरफ़ेस है। तो क्या यह प्रतीकात्मक लिंक वास्तव में मेमोरी में भरी हुई कॉपी की ओर इशारा करता है, लेकिन अधिक उपयोगी नाम के साथ? exeलिंक कैसे काम करता है , बिल्कुल?

जवाबों:


19

/proc/<pid>/exeप्रतीकात्मक लिंक के लिए सामान्य शब्दार्थ का पालन नहीं करता है। तकनीकी रूप से यह POSIX के उल्लंघन के रूप में गिना जा सकता है, लेकिन /procएक विशेष फाइल सिस्टम है।

/proc/<pid>/exeजब आप statयह करते हैं तो एक सिम्लिंक प्रतीत होता है । यह कर्नेल के लिए एक सुविधाजनक तरीका है जो उस पथनामे को निर्यात करने के लिए है जो प्रक्रिया के निष्पादन के लिए जानता है। लेकिन जब आप वास्तव में उस "फ़ाइल" को खोलते हैं, तो सिम्बलिन की सामग्री को पढ़ने की सामान्य प्रक्रिया नहीं है। कर्नेल के बजाय बस आपको खुली फ़ाइल प्रविष्टि तक सीधे पहुंच प्रदान करता है।

ध्यान दें कि जब आप ls -lएक /proc/<pid>/exeऐसी प्रक्रिया के लिए छद्म का उपयोग करते हैं जिसका निष्पादन योग्य हटा दिया गया है, तो इसके अंत में सिमलिंक लक्ष्य में स्ट्रिंग "(हटाए गए)" है। यह सहानुभूति में सामान्य रूप से गैर-सनसनीखेज होगा: निश्चित रूप से एक फ़ाइल नहीं है जो लक्ष्य पथ पर एक नाम के साथ रहता है जो "(हटाए गए)" के साथ समाप्त होता है।

tl; डॉprocफ़ाइलसिस्टम कार्यान्वयन पाथनाम रिज़ॉल्यूशन के साथ सिर्फ अपनी जादुई चीज़ करता है।


1
और मैजिक फाइल सिस्टम proc_exe_link()में रहता है proc: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
स्टीफन किट

आप कैसे जानते हैं कि निश्चित रूप से इस तरह के नाम वाली कोई फ़ाइल नहीं है। किसी ने एक प्रयोग के रूप में बनाया हो सकता है; मैंने पहले भी एक बार किया है। बहुत संभावना नहीं है कि यह किसी अन्य कारण से मौजूद होगा, लेकिन फिर भी असंभव नहीं है।
flarn2006

4

/ 2.2 के मैन पेज के अनुसार, लिनक्स 2.2 के तहत और बाद में, फ़ाइल एक प्रतीकात्मक लिंक है जिसमें निष्पादित कमांड का वास्तविक पथनाम है। जाहिर है, द्विआधारी स्मृति, और में लोड किया जाता /proc/[pid]/exeद्विआधारी की सामग्री के लिए अंक स्मृति में

दूसरी ओर, लिनक्स 2.0 और पहले के तहत, /proc/[pid]/exeजाहिरा तौर पर फ़ाइल (फाइल सिस्टम में) के लिए एक पॉइंटर है जिसे निष्पादित किया गया था।

इसलिए यदि आप लिनक्स 2.0 या उससे पहले के कमांड की एक ही सूची चलाते हैं, तो संभवतः आपको "ऐसी कोई फ़ाइल या निर्देशिका नहीं" प्राप्त होगी।


कौन सा मैनपेज? linux.die.net/man/5/proc और manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html कहते हैं, "इसे खोलने का प्रयास निष्पादन योग्य होगा", लेकिन यह नहीं कहता कि यह कहाँ है से आता है।
मूरू

1
मुझे पूरा यकीन है कि कर्नेल आपको बाइनरी के लिए इनसाइड की सामग्री देता है , बजाय इसकी इन-मेमोरी कॉपी के। इन-मेमोरी कॉपी में फाइल के सभी सेक्शन होने की संभावना नहीं है। दूसरी ओर, इनोड्स, संदर्भ-गणना वाले होते हैं और संदर्भ के मौजूद होने पर इसे अधिलेखित नहीं किया जाएगा। कर्नेल फ़ाइलों को निष्पादित करने के लिए एक संदर्भ रखेगा ताकि यह आवश्यक हो तो अतिरिक्त अनुभागों को लोड कर सके।
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.