फ़ाइल के बजाय नामित पाइप का उपयोग क्यों करें?


42

मैंने हाल ही में नामित पाइपों के बारे में पढ़ा है, और मुझे समझ नहीं आया कि वे क्यों मौजूद हैं।
मैंने कहीं पढ़ा है कि एक नामित पाइप का उपयोग करना फ़ाइल का उपयोग करने की तुलना में कम समय लेने वाला है।

ऐसा क्यों है?
नामित पाइपों को भी मेमोरी में संग्रहीत किया जाना है (और शायद स्वैप किया गया है, फाइलों की तरह)।
जहां तक ​​मैं देख सकता हूं, उन्हें एक इनोड प्राप्त करना होगा जिसे फ़ाइलों की तरह ही वर्तमान निर्देशिका द्वारा संदर्भित किया जाना चाहिए। इसके अलावा, उन्हें प्रोग्रामर द्वारा फाइलों की तरह ही हटा दिया जाना चाहिए।

तो लाभ कहाँ झूठ है?


यह कक्षा के असाइनमेंट का हिस्सा नहीं है, क्या यह है?
don.joey

6
नहीं ... वास्तव में मैं कुछ लेक्चर नोट्स देख रहा था जब मुझे यह प्रश्न मिला और मैं इसका उत्तर नहीं दे सका ... और यदि यह एक असाइनमेंट होता, तो मैं यह नहीं देखता कि यह कैसे प्रासंगिक होगा ... यह पसंद नहीं है जब तक मैं इसे नहीं खोज
लेता,

जवाबों:


41

लिनक्स में लगभग सब कुछ एक फाइल माना जा सकता है , लेकिन एक नियमित फ़ाइल और एक नामित पाइप के बीच मुख्य अंतर यह है कि एक नामित पाइप एक फ़ाइल का एक विशेष उदाहरण है जिसमें फाइल सिस्टम पर कोई सामग्री नहीं है।

यहाँ से बोली है man fifo:

एक FIFO विशेष फ़ाइल (एक नामित पाइप) एक पाइप के समान है, सिवाय इसके कि वह फाइलसिस्टम के हिस्से के रूप में एक्सेस की जाती है। इसे पढ़ने या लिखने के लिए कई प्रक्रियाओं द्वारा खोला जा सकता है। जब प्रक्रियाएं FIFO के माध्यम से डेटा का आदान-प्रदान कर रही हैं, तो कर्नेल सभी डेटा को बिना फाइल सिस्टम में लिखे आंतरिक रूप से पास करता है। इस प्रकार, FIFO विशेष फ़ाइल में फ़ाइल सिस्टम पर कोई सामग्री नहीं है; फाइलसिस्टम प्रविष्टि केवल संदर्भ बिंदु के रूप में कार्य करती है ताकि प्रक्रियाएं फाइलसिस्टम में एक नाम का उपयोग करके पाइप तक पहुंच सकें।

कर्नेल प्रत्येक FIFO विशेष फ़ाइल के लिए बिल्कुल एक पाइप ऑब्जेक्ट रखता है जिसे कम से कम एक प्रक्रिया द्वारा खोला जाता है। डेटा के पारित होने से पहले FIFO को दोनों सिरों (पढ़ना और लिखना) पर खोला जाना चाहिए। आम तौर पर, FIFO ब्लॉक खोलने तक दूसरे छोर को भी खोला जाता है।

इसलिए वास्तव में एक नामित पाइप तब तक कुछ नहीं करता है जब तक कि कुछ प्रक्रिया इसे पढ़ती और लिखती नहीं है। यह हार्ड डिस्क पर कोई स्थान नहीं लेता है (मेटा जानकारी की थोड़ी सी जानकारी को छोड़कर), यह सीपीयू का उपयोग नहीं करता है।

आप इसे ऐसा करके देख सकते हैं:

एक नामित पाइप बनाएं

$ mkfifo /tmp/testpipe

उदाहरण के लिए /home/user/Documents, कुछ निर्देशिका पर जाएं , और नामित पाइप का उपयोग करके, इसके अंदर सब कुछ गज़िप करें।

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

यहां आपको gzip प्रक्रिया का PID देखना चाहिए। हमारे उदाहरण में यह 28584 था।

अब जांचें कि यह पीआईडी ​​क्या कर रहा है

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

आप देखेंगे कि यह बिना संसाधनों का उपयोग कर रहा है । 0% CPU उपयोग, 0% मेमोरी उपयोग।

फ़ाइल स्थान उपयोग के बारे में कूबड़ सत्यापित करें

$ du -h /tmp/testpipe
0   testpipe

और फिर 0, कुछ भी नहीं। जरूरत पड़ने पर दोबारा टेस्टपाइप का इस्तेमाल किया जा सकता है।

का उपयोग कर, को मारने के लिए मत भूलना kill -15 28584। और हमारे नामित पाइप का उपयोग करके हटा देंrm /tmp/testpipe

उदाहरण Usages

नामित पाइप का उपयोग करके आप लगभग सभी चीजों को पुनर्निर्देशित कर सकते हैं। उदाहरण के रूप में आप इस एक लाइन प्रॉक्सी को देख सकते हैं ।

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


14

यह सच है कि आप सिस्टम मेमोरी का उपयोग नहीं करेंगे लेकिन आपके उदाहरण में आप जिस सीपीयू का उपयोग नहीं करते हैं वह केवल इसलिए है क्योंकि आप पाइप को नहीं पढ़ते हैं इसलिए प्रक्रिया प्रतीक्षा कर रही है।

निम्नलिखित उदाहरण पर विचार करें:

mkfifo /tmp/testpipe
tar cvf - / | gzip > /tmp/testpipe

अब एक नया कंसोल खोलें और चलाएँ:

watch -n 1 'ps u -P $(pidof tar)

और एक तीसरे कंसोल में:

cat /tmp/testpipe > /dev/null

यदि आप वॉच cmd (2nd टर्म) को देखते हैं, तो यह सीपीयू की खपत में वृद्धि दिखाएगा!


1
यह उत्तर c0rp के उत्तर के
wjandrea

2

यहां एक उपयोग मामला है जहां नामित पाइप I / O को हटाकर आपको बहुत समय बचा सकते हैं

मान लीजिए कि आपके पास BigFile है, उदाहरण के लिए 10G।

आपके पास 1G, BigFileSplit_01 से BigFile_Split_10 के टुकड़ों में इस BigFile के विभाजन हैं।

अब आपको BigFileSplit_05 की शुद्धता पर संदेह है

नामांकित, बिना नाम के पाइप, आप बिगफाइल से एक नया विभाजन बनाएंगे और तुलना करेंगे:

dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

नामित पाइप के साथ आप करेंगे

mkfifo BigFileSplitOrig_05
dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1 &
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

हो सकता है कि पहली नजर में यह एक बड़ा अंतर न लगे ... लेकिन समय में अंतर बहुत बड़ा है!

विकल्प 1:

  • dd: 1G पढ़ें / 1G लिखें (1)
  • अंतर: 2 जी पढ़ें
  • आरएम: मुक्त आवंटित क्लस्टर / निर्देशिका प्रविष्टि को हटा दें

विकल्प 2:

  • dd: कुछ नहीं! (नामित पाइप को जाता है)
  • अंतर: 2 जी पढ़ें
  • आरएम: प्रबंधन के लिए कोई आवंटित क्लस्टर (हम वास्तव में फाइलसिस्टम के लिए कुछ भी नहीं लिखते थे) / निर्देशिका प्रविष्टि को हटा दें

तो मूल रूप से नामित पाइप आपको यहां 1G प्लस कुछ फाइलसिस्टम सफाई के पढ़ने और लिखने से बचाता है (क्योंकि हमने फाइलसिस्टम के लिए कुछ भी नहीं लिखा है लेकिन खाली पंद्रह नोड है)।

I / O नहीं करना, विशेष रूप से लिखता है, आपके डिस्क के पहनने से बचने के लिए भी अच्छा है। यह और भी दिलचस्प है जब आप SSDs के साथ काम करते हैं क्योंकि उनके पास सीमित संख्या में कोशिकाएं मरने से पहले लिखती हैं।

(1) जाहिर है, एक और विकल्प यह होगा कि उस अस्थायी फ़ाइल को RAM में बनाया जाए, उदाहरण के लिए यदि / tmp RAM (tmpfs) पर आरूढ़ है। फिर भी आप रैम डिस्क के आकार तक सीमित रहेंगे, जबकि "नामित पाइप ट्रिक" की कोई सीमा नहीं है।


0

आप किसी प्रोग्राम को अभी भी लेट सकते हैं और किसी बाहरी घटना के लिए नामित पाइप को सुन सकते हैं। जैसे ही बाहर की घटना होती है (कुछ नए डेटा का f.ex. आगमन) यह किसी अन्य प्रोग्राम द्वारा पता लगाया जा सकता है, जो बदले में पाइप के लिए प्रासंगिक घटना डेटा को लिखने के लिए पाइप खोलता है। जब क्लोज स्टेटमेंट जारी किया जाता है, तो सुनने वाले प्रोग्राम को रीड स्टेटमेंट के माध्यम से पाइप के माध्यम से डेटा की स्ट्रीम प्राप्त होगी, और जो उसे मिला है उसे प्रोसेस करने के लिए तैयार है। सामग्री पढ़ने के बाद पाइप को बंद करना न भूलें। श्रवण कार्यक्रम इसके प्रसंस्करण के परिणाम उसी के माध्यम से, या किसी अन्य नामित पाइप के माध्यम से भी वापस कर सकता है। इस तरह के अंतर-प्रोग्राम संचार कई बार बहुत सुविधाजनक होते हैं।

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