मैंने एक बार बहुत से Xcode से "टूटी हुई पाइप" त्रुटि प्राप्त की है। मैं अब यह जानने के लिए उत्सुक हूं कि वास्तव में एक पाइप क्या है।
एक "पाइप" की अवधारणा क्या है और यह "टूटी" कैसे हो सकती है?
मैंने एक बार बहुत से Xcode से "टूटी हुई पाइप" त्रुटि प्राप्त की है। मैं अब यह जानने के लिए उत्सुक हूं कि वास्तव में एक पाइप क्या है।
एक "पाइप" की अवधारणा क्या है और यह "टूटी" कैसे हो सकती है?
जवाबों:
एक पाइप एक इंटरप्रोसेस संचार (IPC) तंत्र है जो एक प्रक्रिया के मानक आउटपुट को दूसरे के मानक इनपुट से जोड़ने के लिए उपयोग किया जाता है।
एक उदाहरण है जब आप शब्द "पैक्स" के लिए एक फ़ाइल खोजना चाहते हैं:
cat filename | grep pax
और हाँ, मुझे पता है कि आप grep
सीधे फाइल कर सकते हैं लेकिन यह नहीं समझाता है कि यह कैसे काम करता है, क्या यह करता है?
यह cat
कमांड के मानक आउटपुट को कमांड के मानक इनपुट से जोड़ता है grep
। cat
फ़ाइल की सामग्री को इसके मानक आउटपुट पर भेजता है, और grep
इसके मानक इनपुट से इसकी फ़ाइल (इस मामले में) को पढ़ता है। इस तरह से प्रक्रियाओं को एक साथ जोड़कर, आप किसी भी संख्या में पाइप सेगमेंट पर अपने खुद के उपकरण बना सकते हैं। इस तरह की चीजें:
show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20
एक टूटा हुआ पाइप वह है जहां (आमतौर पर) डेटा के रिसीवर ने कनेक्शन बंद कर दिया है, जबकि प्रेषक अभी भी सामान भेजने की कोशिश कर रहा है।
उदाहरण के लिए, यदि आप पेजर प्रोग्राम के माध्यम से एक बड़ी फ़ाइल भेजते हैं (एक समय में एक पृष्ठ देखने के लिए))
cat myfile | pager
और फिर एक करें CTRL-BREAK, इससे pager
प्रक्रिया का cat
उपयोग करने से पहले उसका इनपुट पाइप बंद हो सकता है। इस टूटे हुए पाइप को पाने की एक संभावना है।
एक सरसरी गूगल खोज से , यह विशेष समस्या तदर्थ तैनाती से संबंधित प्रतीत होती है और दिए गए समाधानों में आमतौर पर आपके अधिकांश सॉफ़्टवेयर से बाहर निकलना और आपके अधिकांश उपकरणों को रिबूट करना शामिल होता है।
यह संभवत: गंभीर है कि Apple को इस मुद्दे की रिपोर्ट करें। जितने अधिक डेवलपर इसके बारे में शिकायत करते हैं, उतनी ही संभवत: इसे ठीक करने के लिए कुछ किया जाएगा।
pr -e4 -n ten-thousand-lines.c | sed 10q
टूटी हुई पाइप के साथ समाप्त होता है। क्या pr
आपको यह बताने के लिए परेशान है कि इसे SIGPIPE सिग्नल मिला है; यह संकेत के परिणामस्वरूप अच्छी तरह से बाहर निकल सकता है (गैर-शून्य निकास स्थिति पैदा करता है)।
|
चरित्र अक्सर एक पाइप कहा जाता है। विभिन्न UNIX गोले में (जो मुझे पता है) इसका उपयोग एक कमांड के आउटपुट को दूसरे के इनपुट में पाइप करने के लिए किया जा सकता है।
cat myfile.txt | head
head
आदेश केवल अपने इनपुट की पहली कुछ पंक्तियों को दर्शाता है। उस बिंदु पर, यह अपना इनपुट बंद कर देता है। यह उस कमांड के लिए एक समस्या है जो इनपुट उत्पन्न कर रहा था। यह कहां लिखता है? जब भी हमारे पास यह स्थिति होती है, या जब पाठक के माध्यम से लेखन प्रक्रिया समाप्त होने से पहले की स्थिति होती है, तो इसे "टूटी हुई पाइप" कहा जाता है।
cat
कमांड को हमेशा के लिए बंद करने से रोकने के लिए, UNIX मानक एक विशेष सिग्नल ( SIGPIPE , सिग्नल 13 ) को परिभाषित करता है जो इसे भेजते हैं cat
। इस सिग्नल के लिए डिफ़ॉल्ट कार्रवाई प्रक्रिया को मारना है, जो cat
अंत को अच्छी तरह से बनाता है ।
ऐसा लगता है कि आपके द्वारा उपयोग किए जा रहे एप्लिकेशन में SIGPIPE सहित सभी सिग्नलों के लिए एक सिग्नल हैंडलर स्थापित किया गया है, जो आपके द्वारा देखे जाने वाले छोटे पॉपअप संदेश बनाता है।
यह त्रुटि बहुत बार सामने आती है। /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe यह "है ... अपने फोन से बात करने की Xcode की क्षमता में आंतरिक त्रुटि। यह नहीं है। मतलब आपने कुछ भी गलत किया है, यह विकास प्रणाली में एक बग है "
एक पाइप यूनिक्स सिस्टम पर एक आईपीसी तंत्र है। एक पाइप के दो सिरे होते हैं, एक रीड एंड और एक राइट एंड। डेटा जो राइट एंड में लिखा जाता है, उसे रीड एंड से पढ़ा जा सकता है और उस क्रम में सामने आता है जिसमें यह लिखा गया था।
यूनिक्स कमांड लाइन की दुनिया में, पाइप एक साथ काम करने के लिए हुकिंग कार्यक्रमों का एक बहुत ही सामान्य तरीका है। उदाहरण के लिए sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
फ़ाइल में पढ़ा जाएगा fred.txt
स्ट्रिंग के foo
साथ स्ट्रिंग के सभी उदाहरणों को बदलें bar
फिर उन पंक्तियों के लिए परिणाम खोजें जिनमें bar
कुछ वर्णों की संख्या होती है, फिर baz
।
बेशक, यह बहुत उपयोगी नहीं लगता है। लेकिन मुझे यकीन है कि अगर आप इस बारे में सोचते हैं कि आप देख सकते हैं कि आप कैसे सभी प्रकार के दिलचस्प उपयोगों को करने में सक्षम हो सकते हैं, खासकर जब आपके पास awk
या perl
आपके निपटान में कार्यक्रम हों ।
पाइप सिस्टम बहुत पहले से यूनिक्स का एक हिस्सा रहा है। और अगर आपके पाइपलाइन में एक प्रक्रिया निकलती है तो आप आमतौर पर पाइपलाइन के सभी कार्यक्रमों से बाहर निकलना चाहते हैं। इसका मतलब यह है कि, डिफ़ॉल्ट रूप से, एक पाइप में लिखने वाली प्रक्रिया रीड एंड पर गई प्रक्रिया को SIGPIPE
संकेत मिल जाएगा । और अगर इसका संकेत उस अवरुद्ध हो जाता है, तो write
भी एक विशेष प्रकार की त्रुटि के साथ विफल हो जाएगा जो यह दर्शाता है कि पाइप 'टूट' गया है।
डिफ़ॉल्ट हैंडलिंग SIGPIPE
इसे प्राप्त करने वाली प्रक्रिया को मार देती है। और अगर यह पाइप लाइन का 'हेड' नहीं है, तो पूरी SIGPIPE
चीज़ चेन का प्रचार करती है।
Xcode किस बारे में शिकायत कर रहा है कि इसने एक पाइप के साथ कुछ करने के लिए कुछ सब-प्रोग्राम शुरू किया, और उस सब-प्रोग्राम की अप्रत्याशित रूप से पाइप टूटने से मृत्यु हो गई।
एक "टूटा हुआ" पाइप वह है जहां एक छोर close()
'डी' हो गया है और दूसरे से पढ़ा या लिखा जा रहा है। उदाहरण के लिए, निम्नलिखित शेल कमांड में:
cat foo | less
cat
प्रक्रिया पाइप के लेखन अंत रखती है, और less
प्रक्रिया एक पढ़ने। यदि पाठक प्रक्रिया पाइप को बंद कर देती है, तो पाइप टूट जाता है (और इसलिए बेकार है); लेखक प्रक्रिया ऑपरेटिंग सिस्टम से "टूटी हुई पाइप" त्रुटि प्राप्त करेगी।
cat
स्पष्ट रूप से जैसे ही यह समाप्त हो जाएगा), पाठक बस एक सामान्य एंड-ऑफ़-फ़ाइल देखेंगे।