अनाम पाइप पर नामित पाइप का उपयोग करने के क्या फायदे हैं?


51

मैं साक्षात्कार के प्रश्नों के एक सेट की समीक्षा कर रहा था जो एक यूनिक्स व्यवस्थापक से पूछे जाते हैं; मुझे एक विषय मिला जिसका नाम "पाइप" था।

मैंने इस विषय पर ध्यान दिया; कुछ हद तक मैं इसे समझने में सक्षम हो गया: - नामित पाइप || फीफो

लेकिन फिर भी मुझे लगता है कि मुझे इस विशेष प्रकार के पाइप का उपयोग करने के लिए ज्ञान की कमी है। क्या कोई विशेष परिस्थितियां हैं जहां अनाम पाइप काम करने में विफल होंगे?


तकनीकी मंच पर एक और लिंक: writeulearn.com/category/inter-process-communicationipc

जवाबों:


39

नामित पाइप (फीफो) के चार तीन फायदे हैं जो मैं सोच सकता हूं:

  • आपको एक ही समय में पढ़ने / लिखने की प्रक्रिया शुरू करने की आवश्यकता नहीं है
  • आपके पास कई पाठक / लेखक हो सकते हैं जिन्हें सामान्य वंशावली की आवश्यकता नहीं है
  • एक फ़ाइल के रूप में आप स्वामित्व और अनुमतियों को नियंत्रित कर सकते हैं
  • वे द्वि-दिशात्मक हैं, अनाम पाइप यूनिडायरेक्शनल हो सकते हैं *

    *) एक मानक खोल के बारे में सोचो |पाइपलाइन जो दिशाहीन है, कई गोले ( ksh, zsh, और bash) भी प्रदान करते हैं coprocesses जो द्वि-दिशात्मक संचार की अनुमति। POSIX आधे-द्वैध के रूप में पाइप का इलाज करता है (यानी प्रत्येक पक्ष केवल पढ़ या लिख ​​सकता है), pipe()सिस्टम कॉल दो फ़ाइल हैंडल लौटाता है और आपको एक को केवल-पढ़ने के लिए और दूसरे को केवल-लेखन के रूप में व्यवहार करने की आवश्यकता हो सकती है। कुछ (BSD) सिस्टम एक साथ पढ़ने और लिखने का समर्थन करते हैं (POSIX द्वारा निषिद्ध नहीं), दूसरों पर आपको प्रत्येक दिशा के लिए दो पाइप, एक की आवश्यकता होगी। अपने pipe(), popen()और संभवतः popen2()मैन पेजों की जाँच करें । अप्रत्यक्षता इस पर निर्भर नहीं हो सकती है कि पाइप का नाम है या नहीं, हालांकि लिनक्स 2.6 पर यह निर्भर है।

(अपडेट, स्टीफन चेज़लस से प्रतिक्रिया के लिए धन्यवाद )

तो एक तुरंत स्पष्ट कार्य जिसे आप एक अनाम पाइप के साथ प्राप्त नहीं कर सकते हैं वह एक पारंपरिक क्लाइंट / सर्वर एप्लिकेशन है।

यूनिडायरेक्शनल पाइप के बारे में ऊपर (पिछला) बिंदु, लिनक्स पर प्रासंगिक है, POSIX (देखें popen()) कहता है कि लिनक्स पर केवल पठनीय या लेखन योग्य होना चाहिए , वे यूनिडायरेक्शनल हैं । देखें लिनक्स कर्नेल को समझना लिनक्स विशेष जानकारी के लिए (3 एड। ओ रेली) (p787)। अन्य OS का प्रस्ताव द्विदिश (अनाम) पाइप है।

एक उदाहरण के रूप में, नागियोस अपनी कमांड फ़ाइल के लिए एक फीनिक्स का उपयोग करता है । विभिन्न बाहरी प्रक्रियाएँ (CGI लिपियाँ, बाहरी जाँच, NRPE आदि) इस पंद्रह को कमांड / अपडेट लिखती हैं और ये लगातार Nagios प्रक्रिया द्वारा संसाधित होती हैं।

नामित पाइप में टीसीपी कनेक्शन के विपरीत विशेषताएं नहीं हैं, लेकिन महत्वपूर्ण अंतर हैं। क्योंकि एक फेनो में एक सतत फाइलसिस्टम का नाम होता है, जिसे आप तब भी लिख सकते हैं जब कोई पाठक नहीं होता है, तो जाहिर है कि राइट्स ब्लॉक होंगे (async या नॉन-ब्लॉकिंग I / O के बिना), हालांकि आप रिसीवर के नहीं होने पर डेटा को ढीला नहीं करेंगे शुरू किया (या पुनः आरंभ किया जा रहा है)।

संदर्भ के लिए, यूनिक्स डोमेन सॉकेट्स भी देखें , और इस Stackoverflow प्रश्न का उत्तर जो मुख्य IPC विधियों को सारांशित करता है , और यह वह है जिसके बारे में बात करता हैpopen()


2
आपके पास अनाम पाइप के साथ ही कई पाठक / लेखक हो सकते हैं । लिनक्स पर, वे अनाम पाइप की तुलना में कोई अधिक द्वि-दिशात्मक नहीं हैं। राइटिंग एंड एंड रीडिंग एंड है और डेटा केवल एक दिशा में बहता है। जब आप लेखन मोड में एक पर्चा खोलते हैं, तो आपको लेखन अंत मिलता है, रीडिंग मोड में, आरडब्ल्यू मोड में, आप राइटिंग एंड को पढ़ते हैं और रीडिंग से पढ़ते हैं। यह द्वि-दिशात्मक पाइप या यूनिक्स डोमेन सॉकेट से अलग है, जहां आपके पास वास्तव में प्रत्येक दिशा में डेटा के दो अलग-अलग प्रवाह हैं।
स्टीफन चेज़लस

प्रतिक्रिया के लिए @StephaneChazelas धन्यवाद, मैंने उत्तर को अधिक विशिष्ट होने के लिए अद्यतन किया है, और स्पष्ट (मुझे आशा है) पाइप और दिशात्मकता।
२३

एक नामित पाइप के संचार में डिस्क IO शामिल है? या यह सब स्मृति में है? इन IPC तंत्र के प्रदर्शन लिफाफे को क्या निर्धारित करता है?
CMCDragonkai

15

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

नामित पाइप वास्तव में फीफो के हैं। ये फ़ाइल सिस्टम में नोड्स द्वारा दर्शाए गए लगातार ऑब्जेक्ट हैं। एक नामित पाइप एक या अधिक प्रक्रियाओं के बीच कई-से-कई, दो-तरफ़ा संचार प्रदान करता है जो आवश्यक रूप से संबंधित नहीं हैं और एक ही समय में मौजूद होने की आवश्यकता नहीं है। पाइप का फ़ाइल नाम संचार के लिए प्रक्रियाओं के बीच एक पते या अनुबंध के रूप में कार्य करता है। यदि केवल एक प्रक्रिया एक नामित पाइप को लिखती है और एक अन्य प्रक्रिया नामित पाइप से पढ़ती है, तो नामित पाइप दो संबंधित प्रक्रियाओं के बीच अनाम पाइप के समान व्यवहार करता है।

तो संक्षिप्त उत्तर यह है कि आपको असंबंधित प्रक्रियाओं के बीच संचार के लिए एक नामित पाइप की आवश्यकता है जो एक ही समय में मौजूद नहीं हो सकता है।


+1 मुझे लगता है कि प्रक्रियाएं हमेशा एक ही समय में मौजूद होती हैं (अन्यथा पाइप थोड़ा व्यर्थ है - आप एक नियमित फ़ाइल में सामान छोड़ सकते हैं)। ये और यूनिक्स डोमेन सॉकेट अक्सर डेमॉन सेवाओं द्वारा उपयोग किए जाते हैं जिन्हें कमांड लाइन से नियंत्रित किया जा सकता है, जैसे,। यदि आप /runएक लिनक्स डेस्कटॉप सिस्टम को देखते हैं, तो आप शायद दोनों में से कुछ (पंद्रह और यूनिक्स सॉकेट्स का नाम) पाएंगे। यह IPC का एक रूप है ।
गोल्डीलॉक्स

2
@goldilocks: एक नामित पाइप आमतौर पर एम्बेडेड सिस्टम में प्रक्रियाओं के बीच एक मेमोरी-रेजिडेंट तदर्थ मेलबॉक्स के रूप में उपयोग किया जाता है, जहां संचार प्रक्रियाएं अल्पकालिक होती हैं और एक ही समय में मौजूद नहीं होती हैं। लाभ कार्यान्वयन की सादगी बनाम साझा मेमोरी आईपीसी है और यह तथ्य कि केवल रैम का उपयोग किया जाता है। नुकसान बूट और पाइप के बाइट-वार फीफो प्रकृति बनाम साझा स्मृति के साथ एक संरचना का उपयोग करने की क्षमता के बीच गैर-दृढ़ता है।
जोनाथन बेन-अब्राहम

@ जोनाथन: +1, मुझे कुछ संदेह है: - हम नामित पाइपों को फीफो के रूप में क्यों संदर्भित करते हैं; निरंतर वस्तुएं क्या हैं?
अंकित

@Ankit: कुछ लोग एक नामित पाइप को एक FIFO कहते हैं क्योंकि यह एक FIFO डेटा संरचना की तरह व्यवहार करता है, खासकर जब एकल प्रक्रिया द्वारा पढ़ना और लिखना दोनों के लिए खोला जाता है। "लगातार ऑब्जेक्ट" से मेरा मतलब था कि एक नामित पाइप एक फाइल सिस्टम ऑब्जेक्ट के साथ जुड़ा हुआ है। अर्थात्, यह एक प्रकार की फ़ाइल है, जिसमें एक नाम है, और इसमें मीडिया पर संग्रहीत किसी अन्य फ़ाइल की तरह ही दृढ़ता है।
जोनाथन बेन-अब्राहम

4

कहीं और उल्लेख नहीं किया गया एक फायदा यह है कि एक नामित पाइप का उपयोग उन स्थानों पर किया जा सकता है जहां केवल एक फ़ाइल करेगी।

उदाहरण के लिए, कुछ ईमेल क्लाइंट में प्रत्येक मेल संदेश के लिए ~ / .signature की सामग्री को जोड़ने की सुविधा है। यदि .signature एक कमांड-लाइन विकल्प था या यदि मेल क्लाइंट यह नोटिस करने में सक्षम था कि। signature निष्पादन योग्य है और इसे चलाएं, तो आपको नामांकित पाइप की आवश्यकता नहीं होगी। लेकिन अगर मेल क्लाइंट उस परिष्कृत नहीं है, तो आप एक नामित पाइप बना सकते हैं जिसे .signature और एक एप्लिकेशन चलाएं जो हर बार एक नया हस्ताक्षर बनाता है जो फ़ाइल पढ़ा जाता है।


दिलचस्प। क्या आपके पास ऐसा कोई आवेदन है? ऐसा लगता है कि यह देखने के लिए कर्नेल स्तर पर देखना होगा जब FIFO तक पहुँचा जा रहा था।
वाइल्डकार्ड

4

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

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