सरलीकृत स्पष्टीकरण
कई उपयोगिताओं की तरह, यह एक कार्यक्रम के लिए कुछ अजीब नहीं है, लाइन बफर होने और पूरी तरह से बफरgrep
होने के बीच अपने मानक उत्पादन को बदलता है । पूर्व के मामले में, C लाइब्रेरी बफ़र्स मेमोरी में डेटा तब तक आउटपुट करता है जब तक कि उन डेटा को पकड़ने वाले बफ़र को भर नहीं दिया जाता है या इसमें एक लाइनफ़ीड कैरेक्टर जोड़ दिया जाता है (या प्रोग्राम साफ़-सुथरा समाप्त हो जाता है), जिसके लिए वह वास्तव में बफर कंटेंट लिखने के लिए कॉल करता है। बाद के मामले में, केवल इन-मेमोरी बफर पूर्ण हो रहा है (या सफाई से समाप्त होने वाला प्रोग्राम) ट्रिगर होता है ।write()
write()
अधिक विस्तृत विवरण
यह अच्छी तरह से जाना जाता है, लेकिन थोड़ा गलत है, स्पष्टीकरण। वास्तव में, मानक उत्पादन लाइन बफर नहीं है, लेकिन GNU C लाइब्रेरी और BSD C लाइब्रेरी में स्मार्ट बफर है। मानक इनपुट को पढ़ने के दौरान मानक आउटपुट को भी प्रवाहित किया जाता है, इसकी इन-मेमोरी बफर (पूर्व-पढ़े गए इनपुट) और सी लाइब्रेरी को कुछ और इनपुट लाने के लिए कॉल करना पड़ता है और यह एक नई लाइन की शुरुआत को पढ़ रहा है। (इसका एक कारण गतिरोध को रोकना है जब एक अन्य कार्यक्रम एक फिल्टर के दोनों सिरों से जुड़ता है और लाइन-बाय-लाइन को संचालित करने में सक्षम होने की उम्मीद करता है, फ़िल्टर से लिखने और इसे पढ़ने के बीच बारी-बारी से; जीएनयू में "कॉप्रोसेस" की तरह) उदाहरण के लिए।)read()
awk
C पुस्तकालय प्रभाव
grep
और अन्य उपयोगिताओं ऐसा करते हैं - या, अधिक सख्ती से, सी लाइब्रेरी जो वे उपयोग करते हैं, वे ऐसा करते हैं, क्योंकि यह सी भाषा में प्रोग्रामिंग की एक परिभाषित विशेषता है - जो वे अपने मानक आउटपुट का पता लगाने के आधार पर करते हैं। अगर और केवल अगर) यह एक इंटरेक्टिव डिवाइस नहीं है, तो वे पूर्ण बफरिंग चुनते हैं, अन्यथा वे स्मार्ट बफरिंग चुनते हैं। एक पाइप को एक इंटरैक्टिव डिवाइस नहीं माना जाता है, क्योंकि एक इंटरैक्टिव डिवाइस होने की परिभाषा, कम से कम यूनिक्स और लिनक्स की दुनिया में, अनिवार्य रूप isatty()
से प्रासंगिक फ़ाइल डिस्क्रिप्टर के लिए कॉलिंग रिटर्निंग कॉल सही है।
पूर्ण बफरिंग को अक्षम करने के लिए वर्कअराउंड
कुछ यूटिलिटीज जैसे grep
idiosyncratic विकल्प हैं जैसे --line-buffered
कि इस निर्णय को बदलते हैं, जिसे आप देख सकते हैं कि गलत नाम है। लेकिन फ़िल्टर प्रोग्रामों का एक छोटा सा छोटा हिस्सा जो वास्तव में उपयोग कर सकता है, उसके पास ऐसा विकल्प हो सकता है।
आमतौर पर, कोई भी ऐसे उपकरण का उपयोग कर सकता है जो सी लाइब्रेरी के विशिष्ट इंटर्नल में खोदते हैं और अपने निर्णय लेने में बदलाव करते हैं (जिसमें सुरक्षा समस्याएं हैं यदि प्रोग्राम को बदल दिया जाए तो सेट-यूआईडी है, और विशेष रूप से सी लाइब्रेरी के लिए भी विशिष्ट हैं, और वास्तव में हैं कार्यक्रमों में लिखित या सी भाषा के शीर्ष पर स्तरित), या इस तरह के रूप उपकरण के लिए विशिष्ट ptybandage
है कि नहीं कार्यक्रम के आंतरिक भागों को बदल कर एक छद्म टर्मिनल मानक आउटपुट के रूप में निर्णय के रूप में "इंटरेक्टिव" बाहर आता है तो यह है कि बस लगाना, करने के लिए इसे प्रभावित करो।
आगे की पढाई
cat
फ़ाइलों को सम्मिलित करता है। आप पाइपिंग करके क्या करने की कोशिश कर रहे हैंcat
?