फ़ाइल डिस्क्रिप्टर लिंक की पोर्टेबिलिटी


20

मैंने हमेशा यह सोचा है लेकिन यह पता लगाने के लिए कभी भी समय नहीं लिया है, इसलिए मैं अब ऐसा करूंगा - यहां/proc/$$/fd/$N या तो पोर्टेबल कितना उपयोग दिखाया गया है या /dev/fd/$N? मैं समझता हूँ कि POSIX गारंटियाँ /dev/null, /dev/tty, and /dev/console (हालांकि मुझे केवल यही पता था कि इस उत्तर पर टिप्पणियों को पढ़ने के बाद दूसरे दिन ) लेकिन इन दूसरों के बारे में क्या?

जहाँ तक मेरा वे बहुत आम बता सकते हैं, लेकिन क्या प्रणालियों में मैं कर सकते हैं नहीं उन्हें खोजने के लिए उम्मीद करते हैं? क्यों नहीं? क्या यह एक से दूसरे को खोजने की अधिक संभावना है? क्या वे हमेशा विशेषताओं की तरह प्रदर्शन करेंगे?

मैं इन उपकरणों का उपयोग बड़े पैमाने पर सभी तरीकों से करता हूं, और मैं जानना चाहता हूं कि क्या कोई मौका है जो मैं अभी कोशिश कर रहा हूं।

इसके अलावा उपरोक्त प्रश्नों को केवल वही समझा जाना चाहिए जो मुझे लगता है कि मैं जानना चाहता हूं, लेकिन, चूंकि मुझे स्पष्ट रूप से पहली जगह में पूछना है, इसलिए मुझे इस संबंध में सबसे अच्छा नहीं पता हो सकता है और उन्हें इसके लिए कड़े आवश्यकताओं पर विचार नहीं करना चाहिए एक जवाब। अगर आप कर सकते हैं तो कृपया मुझे क्लू करें।

जवाबों:


27

सिमलिंक अर्ध सार्वभौमिक लिनक्स पर हैं, लेकिन वे कहीं और (Cygwin जो उन्हें emulates को छोड़कर) मौजूद नहीं हैं। AIX और Solaris पर भी मौजूद हैं, लेकिन वे सहानुभूति नहीं हैं। विशेष रूप से, खुली फ़ाइलों के बारे में जानकारी प्राप्त करने के लिए, इंस्टॉल करें ।/proc/PID/fd/NUM/proc/PID/fd/NUMlsof

के साथ एकजुट होता है /proc/PID/fd

लिनक्स

लिनक्स के तहत, फ़ाइल के लिए एक थोड़ा जादू प्रतीकात्मक लिंक है जो आईडी पीआईडी ​​के साथ प्रक्रिया फाइल डिस्क्रिप्टर एनयूएम पर खुला है । यह लिंक इसमें जादू है, उदाहरण के लिए, इसका उपयोग फ़ाइल को हटाने के लिए भी किया जा सकता है, भले ही फ़ाइल हटा दी गई हो। लिंक नाम बदलने के माध्यम से फ़ाइल को भी ट्रैक करेगा। एक जादुई प्रतीकात्मक लिंक है जो इंगित करता है कि पीआईडी वह प्रक्रिया है जो लिंक तक पहुंचती है।/proc/PID/fd/NUM/proc/self/proc/PID

यह सुविधा वस्तुतः सभी लिनक्स सिस्टम पर मौजूद है। यह ड्राइवर द्वारा खरीदे गए फाइलसिस्टम के लिए प्रदान किया जाता है , जो तकनीकी रूप से वैकल्पिक है लेकिन कई चीजों के लिए उपयोग किया जाता है ( psकाम बनाने सहित - यह पढ़ता है ) कि यह लगभग कभी भी एम्बेडेड सिस्टम पर नहीं छोड़ा गया है।/proc/PID

Cygwin

साइग्विन लिनक्स का अनुकरण करता है (सिगविन प्रक्रियाओं के लिए) और ।/proc/PID/fd/NUM/proc/self

सोलारिस (संस्करण 2.6 से), एआईएक्स

प्रत्येक फ़ाइल डिस्क्रिप्टर के लिए प्रविष्टियाँ होती हैं , लेकिन वे उसी प्रकार दिखाई देती हैं जैसे कि खुली हुई फ़ाइल, इसलिए वे फ़ाइल के पथ के बारे में कोई जानकारी नहीं देते हैं। हालांकि वे उसी सूचना को रिपोर्ट करते हैं जो फ़ाइल को खोलने वाली प्रक्रिया को रिपोर्ट करती है, इसलिए यह निर्धारित करना संभव है कि फ़ाइल किस फाइल सिस्टम में स्थित है और इसकी इनकोड संख्या। निर्देशिकाएँ प्रतीकात्मक लिंक के रूप में दिखाई देती हैं, हालांकि वे जादू सिम्बल हैं जिन्हें केवल अनुसरण किया जा सकता है, और एक खाली स्ट्रिंग लौटाता है।/proc/PID/fdstatfstatreadlink

AIX के तहत, procfilesकमांड प्रक्रिया की खुली फाइलों के बारे में कुछ जानकारी प्रदर्शित करता है। सोलारिस के तहत, pfilesकमांड एक प्रक्रिया की खुली फाइलों के बारे में कुछ जानकारी प्रदर्शित करता है। इसमें फ़ाइल का पथ शामिल नहीं है (सोलारिस पर, यह सोलारिस 10 के बाद से करता है, नीचे देखें)।

सोलारिस ( संस्करण 10 से )

इसके अलावा , आधुनिक सोलारिस संस्करणों में लिनक्स के सिमलिंक के समान प्रतीकात्मक लिंक होते हैं । एक प्रक्रिया के बारे में आदेश शो जानकारी रास्तों सहित खुली फ़ाइलों, है।/proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

Plan9

/proc/PID/fdएक पाठ फ़ाइल है जिसमें प्रक्रिया द्वारा खोले गए फ़ाइल विवरणक में एक रिकॉर्ड (लाइन) है। फ़ाइल नाम को वहां ट्रैक नहीं किया गया है।

QNX

/proc/PID/ एक निर्देशिका है, लेकिन इसमें फ़ाइल विवरणकों के बारे में कोई जानकारी नहीं है।

यूनियनों के साथ /procसीधे संपर्क करने के लिए कोई पहुंच नहीं है

(ध्यान दें: कभी-कभी किसी प्रक्रिया की खुली फ़ाइलों के बारे में जानकारी प्राप्त करना संभव होता है, इसकी मेमोरी इमेज के माध्यम से रिफ़्लिंग जो कि सुलभ है /proc। मैं इसे "डायरेक्ट एक्सेस" के रूप में नहीं गिनता।)

एक फ़ाइल कहां है/proc/PID

यूसीआईएक्स 8 वें संस्करण में खरीद फाइलसिस्टम स्वयं शुरू हुआ , लेकिन एक अलग संरचना के साथ, और योजना 9 के माध्यम से और कुछ यूनियनों में वापस चला गया। मुझे लगता है कि सभी ऑपरेटिंग सिस्टमों में /procप्रत्येक PID के लिए एक प्रविष्टि है, लेकिन कई प्रणालियों पर, यह एक निर्देशिका नहीं बल्कि एक नियमित फ़ाइल है। निम्नलिखित प्रणालियों के साथ पढ़ने की जरूरत है :/proc/PIDioctl

  • 2.5 तक सोलारिस
  • OSF / 1 अब Tru64 के रूप में जाना जाता है
  • IRIX (?)
  • एससीओ (?)

MINIX 3

MINIX 3 में एक procfs सर्वर है जो निर्देशिकाओं सहित कई लिनक्स जैसे घटक प्रदान करता है । हालाँकि ऐसा नहीं है ।/proc/PID//proc/PID/fd

FreeBSD

FreeBSD के पास निर्देशिकाएं हैं, लेकिन वे खुले फ़ाइल विवरणकों के बारे में जानकारी प्रदान नहीं करते हैं। (हालांकि , लिनक्स के समान है , जो एक प्रतीकात्मक लिंक के माध्यम से निष्पादन योग्य तक पहुंच प्रदान करता है।)/proc/PID//proc/PID/file/proc/PID/exe

FreeBSD के नतीजों को हटा दिया जाता है

बिना के /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • मैक ओएस एक्स

अन्य चैनलों के माध्यम से फाइल डिस्क्रिप्टर जानकारी

फ्यूज़र

fuserआदेश सूचियों निर्दिष्ट प्रक्रियाओं एक निर्दिष्ट फ़ाइल खुला है, या एक फ़ाइल पर खोले गए उस बिंदु माउंट। यह कमांड मानक है (सभी XSI -compliant सिस्टम पर उपलब्ध है , यानी X / ओपन सिस्टम इंटरफेस एक्सटेंशन के साथ POSIX)।

आप इस उपयोगिता के साथ नाम दर्ज करने के लिए एक प्रक्रिया से नहीं जा सकते।

lsof

Lsof का अर्थ है "सूची खुली फाइलें"। यह एक तृतीय-पक्ष उपकरण है , अधिकांश यूनिक्स वेरिएंट के लिए उपलब्ध (लेकिन आमतौर पर डिफ़ॉल्ट स्थापना का हिस्सा नहीं है)। खुली फ़ाइलों के बारे में जानकारी प्राप्त करना बहुत ही सिस्टम-निर्भर है, क्योंकि ऊपर दिए गए विश्लेषण ने आपको संदेह कर दिया होगा। Lsof मेंटेनर ने सभी को एक ही इंटरफेस के तहत मिलाने का काम किया है।

आप यह देखने के लिए अक्सर पूछे जाने वाले प्रश्न पढ़ सकते हैं कि lsof को किस प्रकार की कठिनाइयों के साथ आना है। अधिकांश यूनियनों पर, खुली फाइलों के नाम के बारे में जानकारी प्राप्त करने के लिए कर्नेल डेटा संरचनाओं को पार्स करने की आवश्यकता होती है। पूछे जाने वाले प्रश्न 3.3 से उद्धरण "क्यों lsof पूर्ण पथ नामों की रिपोर्ट नहीं करता है?":

Lsof निम्नलिखित बोलियों के कर्नेल नाम कैश से पथ नाम घटक प्राप्त नहीं कर सकता है:

  • AIX

केवल लिनक्स कर्नेल खुली हुई फ़ाइलों के बारे में बनाए रखने वाली संरचनाओं में पूर्ण पथ नाम रिकॉर्ड करता है; इसके बजाय, अधिकांश कर्नेल पथ नाम को डिवाइस और नोड नंबर डबल में परिवर्तित करते हैं और फ़ाइलों को खोलने के बाद उन्हें बाद के फ़ाइल संदर्भों के लिए उपयोग करते हैं।

यदि आपको lsofआउटपुट से जानकारी पार्स करने की आवश्यकता है , तो -Fमोड (प्रति पंक्ति एक फ़ील्ड), अधिमानतः -F0मोड (अशक्त-सीमांकित फ़ील्ड) का उपयोग करना सुनिश्चित करें । किसी विशिष्ट प्रक्रिया के एक विशिष्ट फ़ाइल डिस्क्रिप्टर के बारे में जानकारी प्राप्त करने के लिए , उदाहरण के लिए और के -aसाथ विकल्प का उपयोग करें ।-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM वर्तमान प्रक्रिया के फाइल डिस्क्रिप्टर के लिए

कई यूनिक्स संस्करण एक फ़ाइल नाम के माध्यम से अपनी खुली फ़ाइलों तक पहुंचने की प्रक्रिया के लिए एक रास्ता प्रदान करते हैं: उद्घाटन कॉलिंग के बराबर है । ये नाम तब उपयोगी होते हैं जब कोई प्रोग्राम फ़ाइल नाम चाहता है, लेकिन आप पहले से खुली हुई फ़ाइल (जैसे पाइप या सॉकेट) पास करना चाहते हैं; उदाहरण के लिए, शेल जो प्रक्रिया प्रतिस्थापन को लागू करते हैं, उन्हें जहां उपलब्ध हो (अस्थाई नामित पाइप का उपयोग उपलब्ध नहीं है) का उपयोग करें।/dev/fd/NUMdup(NUM)/dev/fd

जहाँ /dev/fdमौजूद है, वहाँ भी आम तौर पर (हमेशा?) समानार्थी शब्द (कभी-कभी प्रतीकात्मक लिंक, कभी-कभी कठिन लिंक, कभी-कभी समतुल्य गुणों वाली मैजिक फाइलें) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= होते हैं /dev/fd/2

  • लिनक्स के तहत, /dev/fdएक प्रतीकात्मक लिंक है /proc/self/fd
  • अधिकांश यूनियनों ( IRIX , OpenBSD , NetBSD , SCO, Solaris , ...) के तहत, प्रविष्टियाँ /dev/fdचरित्र उपकरण हैं। वे आमतौर पर दिखाई देते हैं कि फ़ाइल डिस्क्रिप्टर खुला है या नहीं, और एक निश्चित संख्या से ऊपर फ़ाइल डिस्क्रिप्टर के लिए प्रविष्टियां उपलब्ध नहीं हो सकती हैं।
  • FreeBSD और OSX के तहत, fdescfs फाइल सिस्टम एक गतिशील /dev/fdनिर्देशिका प्रदान करता है जो कॉलिंग प्रक्रिया के खुले विवरणों का अनुसरण करता है। एक स्टैटिक /dev/fdउपलब्ध है /dev/fdमाउंट नहीं है।
  • OSF / 1 (Tru64) के तहत, fdfs के/dev/fd माध्यम से प्रदान किया जाता है ।
  • /dev/fdAIX या HP-UX पर कोई भी नहीं है ।

Solaris के बारे में आपके कथन थोड़े पुराने हैं। सोलारिस 10 साल से कम पुरानी रिलीज के साथ, pfilesकमांड फाइल डिस्क्रिप्टर पथ दिखाता है। यह /proc/<pid>/pathनिर्देशिका से यह जानकारी प्राप्त करता है जिसका आप भी उल्लेख कर सकते हैं। देखें docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre

9

जिस तरह से /procकार्यान्वित किया जाता है और सुविधाओं यह प्रदान करता है किसी भी तरह से मानकीकृत नहीं है, उदाहरण के लिए देखने के लिए यहाँ । विकिपीडिया के अनुसार, FreeBSD "चरणबद्ध" है /proc, विवरण के लिए यहां देखें

के रूप में /dev, /dev/fd/सिस्टम V और BSD समर्थन करते हुए POSIX या सिंगल यूजर स्पेसिफिकेशन (SUSv3) का हिस्सा नहीं है।

परिशिष्ट:

लिनक्स: के /dev/fd/*लिए सहानुभूति है /proc/self/fd

FreeBSD: /dev/fd/*fdescfs के माध्यम से प्रदान किया जाता है।

NetBSD: FreeBSD के समान।

ओपनबीएसडी: फ्रीबीएसडी के समान।

सोलारिस: है /dev/fd/*

IRIX: है /dev/fd/*

Tru64 Unix: nixdoc.net के/dev/fd/* अनुसार , HP में वास्तविक Tru64 प्रलेखन अयोग्य है (लड़का, क्या गड़बड़ है! आपको कुछ नहीं मिला!)।

AIX: सार्वजनिक रूप से उपलब्ध प्रलेखन से कोई संकेत नहीं मिला।

HP-UX: AIX के समान।


तो मुझे /dev/fd/1एक बीएसडी मिलेगा जो मेरे वर्तमान से लिंक करता है 1>? एक बात जो मैं आमतौर पर linux में करता हूं वह है echo 'command' | . /dev/fd/0- क्या इस तरह की बात बोर्ड में काम करने की संभावना है, क्या आपको लगता है?
मोकेसर

मैं अभी बीएसडी सिस्टम तक नहीं पहुँच पाया हूँ, लेकिन मैं इसे समझता हूँ, हाँ।
काउंटरमोड

1
यदि आप कभी भी उस पर विस्तार करने के लिए समय पाते हैं, तो केवल मैं इस उत्तर को स्वीकार करूंगा, मुझे लगता है कि किसी भी आश्चर्य प्रोफेशनल पोस्ट को रोकते हुए, वह है। किसी भी मामले में जुड़ा हुआ पहला लेख एक ज्ञानवर्धक था - बहुत बहुत धन्यवाद।
22 अक्टूबर को सुबह

हाँ। मुझे लगता है कि प्रोफेसर fd सब के बाद दिखाया, हुह? तो, अगली बार बेहतर किस्मत?
मोकेसर

1
सब ठीक तो। लिनक्स: / dev / fd / *, / proc / self / fd के लिए सिम्लिंक हैं। FreeBSD: / dev / fd / * fdescfs के माध्यम से प्रदान किया जाता है। NetBSD: FreeBSD के समान। ओपनबीएसडी: फ्रीबीएसडी के समान। सोलारिस: के पास / देव / एफडी / * है। IRIX: / dev / fd / * है। Tru64 Unix: has / dev / fd / * ( nixdoc.net के अनुसार , HP में वास्तविक Tru64 प्रलेखन अप्राप्य है)। AIX: सार्वजनिक रूप से उपलब्ध प्रलेखन से कोई संकेत नहीं मिला। HP-UX: AIX के समान।
काउंटरमोड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.