/ proc / PID / fd / X लिंक नंबर


36

लिनक्स में, में /proc/PID/fd/X, फ़ाइल डिस्क्रिप्टर के लिए लिंक जो पाइप या सॉकेट हैं एक नंबर है, जैसे:

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

पहली पंक्ति की तरह: 6839. वह संख्या किसका प्रतिनिधित्व करती है?

जवाबों:


36

यह प्रश्न में पाइप या सॉकेट के लिए इनोड नंबर है।

एक पाइप एक यूनिडायरेक्शनल चैनल है, जिसमें एक लेखन अंत और एक रीड एंड है। आपके उदाहरण में, ऐसा लगता है कि एफडी 5 और एफडी 6 एक दूसरे से बात कर रहे हैं, क्योंकि इनोड नंबर समान हैं। (शायद नहीं, हालांकि नीचे देखें।)

एक पाइप पर खुद से बात करने वाले प्रोग्राम को देखने से ज्यादा आम है अलग-अलग प्रोग्राम की एक जोड़ी एक दूसरे से बात करते हुए, आमतौर पर क्योंकि आप एक खोल के साथ उनके बीच एक पाइप सेट करते हैं:

shell-1$ ls -lR / | less

फिर एक और टर्मिनल विंडो में:

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

यह कहता है कि पीआईडी ​​4242 का मानक आउटपुट (एफडी 1, कन्वेंशन द्वारा) इनोड नंबर 222536390 के साथ एक पाइप से जुड़ा है, और यह कि पीआईडी ​​4243 का मानक इनपुट (एफडी 0) उसी पाइप से जुड़ा है।

जिनमें से सभी का यह कहने का एक लंबा तरीका है कि lsआउटपुट को lessइनपुट के लिए भेजा जा रहा है ।

अपने उदाहरण पर वापस जा रहे हैं, एफडी 1 और एफडी 2 लगभग निश्चित रूप से एक दूसरे से बात नहीं कर रहे हैं। सबसे अधिक संभावना है कि यह stdout (FD 1) और stderr (FD 2) को एक साथ बांधने का परिणाम है, इसलिए वे दोनों एक ही गंतव्य पर जाते हैं। आप एक बॉर्न शेल के साथ ऐसा कर सकते हैं:

$ some-program 2>&1 | some-other-program

इसलिए, यदि आपने चारों ओर poked है, तो आपको उदाहरण के /proc/$PID_OF_SOME_OTHER_PROGRAM/fdलिए FD 1 और 2 के साथ संलग्न होने के साथ ही इनकोड संख्या के साथ एक पाइप से जुड़ा तीसरा एफडी मिलेगा some-program। यह आपके उदाहरण में एफडी 5 और 6 के साथ भी हो सकता है, लेकिन मेरे पास कोई तैयार सिद्धांत नहीं है कि ये दोनों एफडी एक साथ कैसे बंधे। आपको यह जानना होगा कि यह पता लगाने के लिए कार्यक्रम आंतरिक रूप से क्या कर रहा है।


1
मुझे लगता है कि उदाहरण, pidginयह पाइप और सॉकेट और अन्य सामान था, इसलिए यह एक अच्छा उदाहरण था। एक अंतिम प्रश्न: इनकोड केवल एक विशेष फाइलसिस्टम के संदर्भ में विशिष्ट हैं, सही? जैसा कि, मैं अपने /फाइल सिस्टम पर इनकोड 3 , और मेरे फाइल सिस्टम पर एक और (अलग) इनोड 3 रख सकता था /boot
थानाटोस

4
हाँ। के मामले में /procफाइल सिस्टम, आईनोड संख्या सिर्फ मक्खी (देखें पर बने होते हैं get_next_ino()में fs/inode.cकर्नेल में), 0 से शुरू है जब सिस्टम हाल में हटा दिया गया है। तंत्र है कि उन्हें बनाता है अप लिनक्स के impersistent फ़ाइल सिस्टम (proc, configfs, ramfs, autofs ...) जो बीच में आईनोड संख्या के कई द्वारा साझा किया जाता हैं अद्वितीय भले ही POSIX अर्थ विज्ञान यह मांग नहीं है। हालांकि यह एक विशेष मामला है। आप जिस नियम के बारे में बात कर रहे हैं, वह आमतौर पर ext3 जैसे सामान्य लगातार फाइल सिस्टम के संबंध में संदर्भित है।
वारेन यंग

33

सॉकेट के लिए आप इनोड के बारे में अधिक जानकारी पा सकते हैं /proc/net/tcp, /proc/net/udpया /proc/net/unix। उदाहरण के लिए:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

हम देखते हैं कि इनोड 53710569 है।

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

इस मामले में, यह एक सुनने वाला सॉकेट (कोई दूरस्थ पता नहीं है), स्थानीय पोर्ट 27 (0x1B) पर सुन रहा है। आईपी ​​पते "नेटवर्क संकेतन" में हेक्स में 4 बाइट्स हैं, आप inet_ntoaइसे मानक एबीसी संकेतन (इस मामले में 127.0.0.1) में बदलने के लिए फ़ंक्शन का उपयोग कर सकते हैं ।

ध्यान दें कि ये फाइलें 0 बाइट्स की प्रतीत होती हैं, लेकिन यदि आप इन्हें पढ़ते हैं तो सामग्री है। यह भी ध्यान दें कि -agrep के साथ आवश्यक है क्योंकि वे (जैसे unix) बाइनरी प्रतीत हो सकते हैं।


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