टूटी पाइप के साथ एक यूनिक्स प्रक्रिया क्या मर जाती है?


30

यहाँ कुछ विकल्प दिए गए हैं, जिनके बारे में मुझे यकीन नहीं है कि कौन सही है।

  1. पाइप से पढ़ने में I / O त्रुटि थी।
  2. पाइप के दूसरे छोर पर लिखने की प्रक्रिया में विफलता के साथ मृत्यु हो गई।
  3. सभी प्रक्रियाएं जो पाइप को लिख सकती थीं, उन्होंने इसे बंद कर दिया है।
  4. पाइप का राइट बफर भरा हुआ है।
  5. सहकर्मी ने डुप्लेक्स पाइप की दूसरी दिशा को बंद कर दिया है।
  6. लेखन विफल रहा क्योंकि ऐसी कोई प्रक्रिया नहीं है जो पाइप से पढ़ सके।
  7. एक सिस्टम कॉल ने EPIPE त्रुटि लौटा दी, और कोई त्रुटि हैंडलर स्थापित नहीं किया गया था।

आपका सवाल क्या हैं? क्या आप पूछ रहे हैं कि उनमें से कौन सा सही है, या अगर कोई अन्य चीजें हैं जो टूटी हुई पाइप का कारण बन सकती हैं?
आठबेटटोनी

@EightBitTony इनमें से कौन सी सही है
स्यामई

जवाबों:


38

जब एक पाइप (नाम या नहीं) या सॉकेट प्रकार SOCK_STREAM को लिखने का प्रयास करता है, तो एक SIGPIPE प्राप्त करता है जिसमें कोई पाठक नहीं बचा है।

यह आम तौर पर व्यवहार चाहता है। एक विशिष्ट उदाहरण है:

find . | head -n 1

आप findएक बार headसमाप्त हो जाने के बाद भी चालू नहीं रखना चाहते (और फिर उस पाइप पर पढ़ने के लिए खुला एकमात्र फ़ाइल विवरणक बंद कर दिया)।

yesआदेश आम तौर पर है कि संकेत समाप्त करने के लिए पर निर्भर है।

yes | some-command

"Y" लिखेंगे जब तक कि कुछ-कमांड समाप्त न हो जाए।

ध्यान दें कि यह न केवल जब कमांड से बाहर निकलता है, यह तब होता है जब सभी पाठक ने अपने रीडिंग एफडी को पाइप पर बंद कर दिया है। में:

yes | ( sleep 1; exec <&-; ps -fC yes)
      1 2       1        0

1 (उपधारा) होगी, फिर 2 (उपधारा + नींद), फिर 1 (उपधारा) तो 0 fd पाइप से पढ़ने के बाद जब yesउपश्रेणी उसके स्टड को बंद कर देगी , और जब कोई SIGPIPE प्राप्त होगा।

ऊपर, अधिकांश गोले pipe(2)थोड़ी देर के लिए ksh93उपयोग करते हैं socketpair(2), लेकिन व्यवहार उस संबंध में समान है।

एक प्रक्रिया SIGPIPE, लेखन प्रणाली कॉल पर ध्यान नहीं देता है (आम तौर पर writeहै, लेकिन हो सकता है pwrite, send, splice...) एक साथ रिटर्न EPIPEत्रुटि। तो टूटी हुई पाइप को मैन्युअल रूप से संभालने की प्रक्रिया आमतौर पर SIGPIPE को नजरअंदाज करेगी और EPIPE त्रुटि पर कार्रवाई करेगी।


14

(6)

लेखन विफल रहा क्योंकि ऐसी कोई प्रक्रिया नहीं है जो पाइप से पढ़ सके।

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

से man 7 pipe:

यदि एक पाइप के रीड एंड के संदर्भ में सभी फ़ाइल डिस्क्रिप्टर बंद हो गए हैं, तो एक लिखित (2) कॉलिंग प्रक्रिया के लिए एक SIGPIPE सिग्नल उत्पन्न करेगा। यदि कॉलिंग प्रक्रिया इस सिग्नल को अनदेखा कर रही है, तो लिखना (2) EPIPE त्रुटि के साथ विफल हो जाता है।

तो एक "टूटी हुई पाइप" लेखक को है कि ईओएफ पाठक के लिए क्या है।


0

एक टूटी हुई पाइप तब होती है जब पढ़ने की प्रक्रिया लेखन प्रक्रिया से पहले निकल जाती है। इसलिए मैं (6)


2
एक पाइप को पढ़ने या लिखने की कई प्रक्रियाएं हो सकती हैं, और उसी प्रक्रिया को पढ़ना और लिखना हो सकता है। इसके अलावा, यह बाहर निकलने के बारे में नहीं है, यह फ़ाइल विवरणक को बंद करने के बारे में है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.