आपके प्रदर्शन प्रश्न के बारे में, पाइप फ़ाइलों की तुलना में अधिक कुशल हैं क्योंकि किसी भी डिस्क IO की आवश्यकता नहीं है। तो cmd1 | cmd2
अधिक कुशल से अधिक है cmd1 > tmpfile; cmd2 < tmpfile
(यह सच नहीं हो सकता है अगर tmpfile
रैम डिस्क या अन्य मेमोरी डिवाइस पर नामित पाइप के रूप में समर्थित है, लेकिन अगर यह एक नामित पाइप है, तो इसे cmd1
पृष्ठभूमि में चलाया जाना चाहिए क्योंकि पाइप पूर्ण हो जाने पर इसका आउटपुट ब्लॉक हो सकता है )। आप का परिणाम की जरूरत है cmd1
और अभी भी करने के लिए इसके उत्पादन भेजने की जरूरत है cmd2
, तो आप चाहिए cmd1 | tee tmpfile | cmd2
की अनुमति देगा जो cmd1
और cmd2
परहेज डिस्क से संचालन को पढ़ने के समानांतर में चलाने के लिए cmd2
।
यदि एक ही पाइप से कई प्रक्रियाएं पढ़ी / लिखी जाती हैं तो नामांकित पाइप उपयोगी होते हैं। वे तब भी उपयोगी हो सकते हैं जब फ़ाइलों का उपयोग करने की आवश्यकता वाले अपने IO के लिए stdin / stdout का उपयोग करने के लिए कोई प्रोग्राम डिज़ाइन नहीं किया गया हो । मैंने इटैलिक में फाइलें डाल दीं क्योंकि नामित पाइप बिल्कुल स्टोरेज पॉइंट की फाइलें नहीं हैं क्योंकि वे मेमोरी में रहते हैं और एक निश्चित बफर साइज है, भले ही उनके पास फाइलसिस्टम एंट्री हो (संदर्भ उद्देश्य के लिए)। अन्य बातों के बस के बारे में सोच: यूनिक्स में फाइल किया जा रहा बिना फाइल सिस्टम प्रविष्टियाँ /dev/null
या में अन्य लोगों प्रविष्टियों /dev
या /proc
।
जैसा कि पाइप (नाम और अनाम) में एक निश्चित बफर आकार है, उन्हें पढ़ने / लिखने के संचालन ब्लॉक कर सकते हैं, जिससे IOWait राज्य में पढ़ने / लिखने की प्रक्रिया चल सकती है। इसके अलावा, मेमोरी बफर से पढ़ते समय आपको ईओएफ कब मिलता है? इस व्यवहार पर नियम अच्छी तरह से परिभाषित हैं और आदमी में पाए जा सकते हैं।
एक चीज जिसे आप पाइप के साथ नहीं कर सकते हैं (नाम और अनाम) डेटा में वापस मांगता है। जैसा कि उन्हें मेमोरी बफर का उपयोग करके कार्यान्वित किया जाता है, यह समझ में आता है।
के बारे में "everything in Linux/Unix is a file"
, मैं सहमत नहीं हूं। नामित पाइप में फ़ाइल सिस्टम प्रविष्टियाँ हैं, लेकिन वास्तव में फ़ाइल नहीं हैं। फ़ाइल सिस्टम प्रविष्टियाँ नहीं हैं (शायद को छोड़कर /proc
)। हालाँकि, UNIX पर अधिकांश IO परिचालनों को रीड / राइट फंक्शन का उपयोग करके किया जाता है , जिसमें एक फाइल डिस्क्रिप्टर की जरूरत होती है , जिसमें अनाम पाइप (सॉकेट) शामिल है। मुझे नहीं लगता कि हम ऐसा कह सकते हैं "everything in Linux/Unix is a file"
, लेकिन हम निश्चित रूप से ऐसा कह सकते हैं "most IO in Linux/Unix is done using a file descriptor"
।