यूनिक्स पाइप की सटीक सरलता क्या है


52

मैंने यह कहानी सुनी है कि डगलस मैक्लेरो कैसे अवधारणा के साथ आए और केन थॉम्पसन ने एक रात में इसे कैसे लागू किया।

जहां तक ​​मैं समझता हूं, पाइप एक सिस्टम कॉल है जो दो प्रक्रियाओं के बीच मेमोरी का एक टुकड़ा साझा करता है जहां एक प्रक्रिया लिखती है और अन्य से पढ़ता है।

जैसा कि कोई व्यक्ति जो ओएस इंटर्न या अवधारणाओं से परिचित नहीं है, मैं सोच रहा था कि कहानी में वास्तव में "जीनियस" क्या है? क्या यह स्मृति को साझा करने वाली दो प्रक्रियाओं का विचार है? या यह कार्यान्वयन है? अथवा दोनों?

पुनश्च: मुझे पाइप की उपयोगिता या शेल में इसका उपयोग करने का तरीका पता है। सवाल अवधारणा और कार्यान्वयन के बारे में है|


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

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

6
@WarrenP वास्तव में, यूनिक्स मानक इनपुट और मानक-आउटपुट मिल की वजह सेpipe() syscall और |खोल ऑपरेटर (: रेफरी मेक्लोरी )। या, जैसा कि वोल्टेयर ने कहा था, " अगर [stdio] मौजूद नहीं था, तो यह [यह] आविष्कार करना आवश्यक होगा। " :-)
रॉस पैटरसन

फ़ाइल हैंडल, और एएफआर पाइप्स के अंदर और बाहर के हैंडल जैसी कोई चीज़ नहीं थी?
वॉरेन पी

4
@ArrenP: ऐसा लगता है कि पैटरसन जो कह रहा है वह यह है: पहले फ़ाइल हैंडल थे। फिर ये लोग इस विचार के साथ आए कि प्रत्येक कार्यक्रम एक इनपुट हैंडल और आउटपुट हैंडल डिफॉल्ट रूप से होता है, जो तब प्रोग्राम को तुच्छ श्रृंखला की अनुमति देता है। इन्हें "मानक" इनपुट / आउटपुट के रूप में जाना जाता है।
मूविंग डक

जवाबों:


109

जहां तक ​​मैं समझता हूं, पाइप एक सिस्टम कॉल है जो दो प्रक्रियाओं के बीच मेमोरी का एक टुकड़ा साझा करता है जहां एक प्रक्रिया लिखती है और अन्य से पढ़ता है।

दरअसल, इसमें कोई साझा मेमोरी शामिल नहीं है। पाठक और लेखक अपने पते के स्थान का कोई हिस्सा साझा नहीं कर रहे हैं, और वे किसी भी स्पष्ट सिंक्रनाइज़ेशन का उपयोग नहीं कर रहे हैं।

पढ़ने और लिखने की प्रक्रिया कर रहे हैं readऔर writeसिस्टम को कॉल बिल्कुल के रूप में वे अगर वे / एक फाइल करने के लिए लिखने से पढ़ रहे थे होगा। यह जीनियस है ... इनोवेशन: यह धारणा कि (सरल) इंटरप्रोसेस कम्युनिकेशन और फाइल I / O को उसी तरह से हैंडल किया जा सकता है ... एप्लिकेशन प्रोग्रामर और यूजर के नजरिए से।

एक बार पाइप स्थापित हो जाने के बाद, ओएस (एप्लिकेशन-कोड या उपयोगकर्ता-स्थान में पुस्तकालय नहीं) बफरिंग और समन्वय का ख्याल रखता है। पारदर्शी रूप से।


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

वैकल्पिक रूप से, यदि आप एक सच्ची पाइपलाइन चाहते थे, तो आप रीडिंग / राइटिंग को समन्वित करने के लिए एक (वास्तविक) साझा मेमोरी सेगमेंट स्थापित करने के लिए और सेमीफ़ोर्स (या कुछ) का उपयोग करने के लिए दोनों एप्लिकेशन को कोड कर सकते थे। जटिल ... और एक परिणाम के रूप में अक्सर नहीं किया।


34
"यह प्रतिभा है ... नवाचार: यह धारणा कि संचार और फ़ाइल I / O को उसी तरह से संभाला जा सकता है" - बिल्कुल यही। यह आपको उन प्रोग्रामों के बीच इंटरप्रोसेस संचार करने की अनुमति देता है जो कभी भी इसे डिज़ाइन नहीं किए गए थे, और यह भी नहीं पता (की जरूरत है) कि क्या हो रहा है।
गुंतराम ब्लोहम

6
यह नोट करना भी उपयोगी है कि IPC के लिए फ़ाइल I / O का उपयोग करने का कारण मुख्य रूप से उपयोगी था क्योंकि Unix को टेक्स्ट प्रोसेसिंग के लिए डिज़ाइन किया गया था - प्रोग्राम से प्रोग्राम में टेक्स्ट डेटा स्ट्रीमिंग करना, अपेक्षाकृत दर्द रहित रचना को सक्षम करना, जिसका अर्थ था कि पूरे सिस्टम से बनाया जा सकता है। अपेक्षाकृत सरल, छोटे कार्यक्रम जो सरल ऑपरेशन के एक (संभवत:) लंबी श्रृंखला में एक से दूसरे में डेटा प्रवाहित करते हैं। मूल रूप से, इसका मतलब था कि आपके पास टेक्स्ट प्रोसेसिंग को संभालने के लिए एक अपेक्षाकृत लचीली भाषा थी।
लुआं

1
और इसलिए "यूनिक्स पाइप की सरलता" "यूनिक्स की सरलता" है: सभी i / o (इंटरप्रोसेस संचार, मानक फाइलें और बाकी फाइल सिस्टम ऑब्जेक्ट सहित) को फाइलों के रूप में संभाला जाता है।
मार्क हर्ड

प्रतिभा का एक और स्ट्रोक था कि UNIX ने मानव-पठनीय फ़ाइल संरचनाओं की उस समय में वकालत की, जब हर बाइट को गिना जाता था ...
EvertW

14

मेरी राय में, "पाइप" के विचार की प्रतिभा उपयोग की सरलता है।

आपको कोई भी सिस्टम कॉल नहीं करना है, मेमोरी आवंटित करना, कुछ भी जटिल नहीं है। शेल में, आप एकल वर्ण का उपयोग करते हैं |:। यह किसी दिए गए कार्य के लिए सरल (या जटिल) साधनों के संयोजन में असाधारण शक्ति देता है।

रोजमर्रा के कुछ सामान्य कार्य जैसे कि बड़े करीने से पाठ छाँटना। आपके पास एक आदेश हो सकता है जो नामों के पूरे समूह को सूचीबद्ध करता है। (मेरे उदाहरण के लिए, मैं एक फाइल का उपयोग करूंगा जिसमें नामों का एक समूह है, listofrandomnames.com के सौजन्य से।) पाइप का उपयोग करके आप निम्न की तरह कुछ कर सकते हैं:

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

यह तो केवल एक उदाहरण है; हजारों हैं। कुछ अन्य विशिष्ट कार्यों के लिए, जो पाइप के उपयोग से उल्लेखनीय रूप से आसान हो जाते हैं, इस पृष्ठ पर "द यूनिक्स दर्शन" अनुभाग देखें ।


इस उत्तर को रेखांकित करने के लिए, स्लाइड 9 को प्रेजेंटेशन के 9 के माध्यम से देखें , "व्हाई ज़श कूलर इज योर शेल।"


मुझे पता है कि उपरोक्त कमांड में UUOC शामिल है । मैंने इसे खड़ा होने दिया क्योंकि यह एक मनमाना कमांड के लिए एक प्लेसहोल्डर है जो टेक्स्ट उत्पन्न करता है।


3
छोटे छोटे नोट : तेजी से sort -uकाम कर सकते हैं sort | uniq
इविलनोटिक्सिस्ट इडोनोटेक्सिस्ट

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100आप इसका उपयोग कर सकते हैं, लेकिन मैं इसे सरल नहीं कहूंगा। खासतौर पर awkहिस्सा।
फेडरिको पोलोनी

पाइप सरल हैं। मैंने कहा, "... किसी दिए गए कार्य के लिए सरल (या जटिल) साधनों के संयोजन में असाधारण शक्ति ।"
वाइल्डकार्ड

5

इसलिए मैंने पीडीपी -10 / TOPS-10 मैनुअल की खोज करके इस पर थोड़ा शोध करने की कोशिश की ताकि पता लगाया जा सके कि पाइप से पहले कला की स्थिति क्या थी। मुझे यह पता चला , लेकिन TOPS-10 उल्लेखनीय रूप से Google के लिए कठिन है। पाइप के आविष्कार पर कुछ अच्छे संदर्भ हैं: McIlroy के साथ एक साक्षात्कार , UNIX के इतिहास और प्रभाव पर

आपको इसे ऐतिहासिक संदर्भ में रखना होगा। हमारे द्वारा दिए गए आधुनिक उपकरणों और उपयुक्तताओं में से कुछ अस्तित्व में हैं।

"शुरुआत में, थॉम्पसन ने खुद पीडीपी पर भी कार्यक्रम नहीं किया, बल्कि GE-635 मशीन पर GEMAP असेंबलर के लिए मैक्रोज़ के एक सेट का उपयोग किया।" (29) GE 635 पर एक पेपर टेप उत्पन्न किया गया और फिर इसका परीक्षण किया गया। PDP-7 तक, रिची के अनुसार, "एक आदिम यूनिक्स कर्नेल, एक संपादक, एक असेंबलर, एक साधारण शेल (कमांड इंटरप्रेटर), और कुछ यूटिलिटीज (जैसे यूनिक्स आरएम, बिल्ली, सीपीपी कमांड) पूरे हुए।" बिंदु, ऑपरेटिंग सिस्टम स्वावलंबी था, कार्यक्रमों को कागज के टेप का सहारा लिए बिना लिखा और परखा जा सकता था, और पीडी -7 पर ही विकास जारी रहा। "

एक पीडीपी -7 इस तरह दिखता है । इंटरेक्टिव डिस्प्ले या हार्ड डिस्क की कमी पर ध्यान दें। "फाइलसिस्टम" को चुंबकीय टेप पर संग्रहीत किया जाएगा। कार्यक्रमों और डेटा के लिए 64kB तक मेमोरी थी।

उस वातावरण में, प्रोग्रामर सीधे हार्डवेयर को संबोधित करने के लिए जाते हैं, जैसे कि टेप को स्पिन करने के लिए आदेश जारी करके और वर्णों को एक बार टेप इंटरफ़ेस से सीधे पढ़ा जाता है। UNIX ने इस पर अमूर्तताएं प्रदान कीं, ताकि "टेलेटाइप से पढ़ें" और "टेप से पढ़ें" के बजाय अलग-अलग इंटरफेस हो, उन्हें एक में जोड़ दिया गया, जिसमें डिस्क के साथ एक अस्थायी प्रतिलिपि संग्रहीत किए बिना "अन्य प्रोग्राम के आउटपुट से पढ़ा गया" के महत्वपूर्ण पाइप जोड़। या टेप ”।

यहाँ के आविष्कार पर McIlroy है grep। मुझे लगता है कि यह प्री-यूनिक्स पर्यावरण में आवश्यक कार्य की मात्रा को समेटने का एक अच्छा काम करता है।

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

"प्रक्रिया थकाऊ, और बहुत ही बेकार थी, क्योंकि डिक्शनरी को विभाजित किया जाना था (एक लाइन पर विभाजन कॉपी छोड़ने का जोखिम नहीं उठा सकता था)। फिर एड ने प्रत्येक भाग को / tmp में कॉपी किया, जी कमांड को पूरा करने के लिए दो बार स्कैन किया। और अंत में इसे फेंक दिया, जिसमें समय भी लगता है। "

"एक दोपहर मैंने केन थॉम्पसन से पूछा कि क्या वह संपादक से नियमित अभिव्यक्ति पहचानकर्ता को उठा सकता है और इसे करने के लिए एक पास-पास बना सकता है। उसने कहा कि हाँ। अगली सुबह मुझे अपने मेल में एक नोट मिला जिसे grep नाम के एक कार्यक्रम की घोषणा की। यह एक आकर्षण की तरह काम करता है। जब उनसे पूछा गया कि उस मज़ेदार नाम का क्या मतलब है, तो केन ने कहा कि यह स्पष्ट था। यह संपादक के आदेश के लिए खड़ा था कि यह नकली, जी / रे / पी (वैश्विक नियमित अभिव्यक्ति प्रिंट)। "

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100उदाहरण के लिए उसके पहले भाग की तुलना करें । यदि आपके विकल्प "कमांड लाइन का निर्माण करते हैं" बनाम "विशेष रूप से उद्देश्य के लिए एक कार्यक्रम लिखें, हाथ से, असेंबलर में", तो यह कमांड लाइन बनाने के लायक है। भले ही इसे करने के लिए पेपर (पेपर) मैनुअल को पढ़ने में कुछ घंटे लगते हों। फिर आप इसे भविष्य के संदर्भ के लिए लिख सकते हैं।


1

पाइप्स की प्रतिभा यह है कि यह तीन महत्वपूर्ण विचारों को जोड़ती है।

सबसे पहले, पाइप 'सह-दिनचर्या' का व्यावहारिक कार्यान्वयन है, जो कि 1958 में कॉनवे द्वारा गढ़ा गया था, जो कि होनहार था लेकिन पाइप्स से पहले इसका बहुत कम व्यावहारिक उपयोग था।

दूसरे, शेल भाषा में पाइपों को लागू करके, थॉम्पसन एट अल ने पहली वास्तविक 'ग्लू भाषा' का आविष्कार किया।

ये दो बिंदु पुन: प्रयोज्य सॉफ्टवेयर घटकों को एक निम्न-स्तर, अनुकूलित भाषा में कुशलता से विकसित करने की अनुमति देते हैं, और फिर बहुत बड़े, अधिक जटिल कार्यक्षमता बनाने के लिए एक साथ चिपके रहते हैं। उन्होंने इसे 'प्रोग्रामिंग इन द लार्ज' कहा।

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

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

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