2010-03-04 13 views
9

अजगर प्रलेखन राज्यों popen के लिए: भरने अन्य ओएस पाइप बफ़र्स में से किसी की वजह सेक्या कोई पाइप बफर डेडलॉक समझा सकता है?

चेतावनी का प्रयोग करें बल्कि .stdin.write, .stdout.read से संवाद() या गतिरोध से बचने के लिए .stderr.read और बाल प्रक्रिया को अवरुद्ध करना

अब, मैं यह पता लगाने की कोशिश कर रहा हूं कि यह डेडलॉक कैसे हो सकता है और क्यों।

मेरा मानसिक मॉडल: सबप्रोकस स्टडआउट/गलती के लिए कुछ उत्पन्न करता है, जिसे बफर किया जाता है और बफर भरने के बाद, यह उपप्रोकैस के स्टडआउट/गलती पर फंस जाता है, जो पाइप के माध्यम से मूल प्रक्रिया में भेजता है।

कौन से दस्तावेज कहता है, पाइप के पास इसका स्वयं का बफर है और जब यह भर जाता है या उपप्रोसेस समाप्त हो जाता है, तो यह मूल प्रक्रिया में आ जाता है।

किसी भी तरह से (पाइप बफर के साथ या नहीं), मुझे पूरा यकीन नहीं है कि डेडलॉक कैसे हो सकता है। केवल एक चीज जिसे मैं सोच सकता हूं वह है कि "ग्लोबल" ओएस पाइप बफर प्रक्रियाएं अजीब लगती हैं। दूसरा यह है कि अधिक प्रक्रियाएं एक ही पाइप साझा करेंगी, जो स्वयं पर नहीं होनी चाहिए।

कोई यह समझाने कृपया कर सकते हैं?

उत्तर

6

सावधान, इसमें एक सूक्ष्म गलती है।

मेरे मानसिक मॉडल: subproccess stdout करने के लिए/अं कुछ है, जो है बफ़र पैदा करता है और बाद बफर भर जाता है, यह subproccess है, जो माता-पिता की प्रक्रिया के लिए पाइप के माध्यम से भेजने के लिए stdout/गलती करना प्लावित है।

बफर माता-पिता और बाल प्रक्रिया द्वारा साझा किया जाता है।

सबप्रोसेस स्टडआउट के लिए कुछ उत्पन्न करता है, जो वही बफर है जो मूल प्रक्रिया को पढ़ना है।

जब बफर भर जाता है, तब तक बफर खाली होने तक लिखना बंद हो जाता है। फ्लश का मतलब पाइप से कुछ भी नहीं है, क्योंकि दो प्रक्रियाएं एक ही बफर साझा करती हैं।

डिस्क पर फ़्लशिंग करने का मतलब है कि डिवाइस ड्राइवर को बाइट्स को डिवाइस पर नीचे धक्का देना चाहिए। एक सॉकेट फ्लश करना मतलब है कि एक बफर जमा करने और सामान भेजने के लिए टीसीपी/आईपी को बताने के लिए कहें। कंसोल पर फ़्लश करना मतलब है कि एक नई लाइन के लिए प्रतीक्षा करना बंद करें और डिवाइस ड्राइवर के माध्यम से बाइट को डिवाइस पर दबाएं।

+0

यही वह है जो मैं इतना निश्चित नहीं था। धन्यवाद। – Almad

1

दोनों बफर (stdin और stdout) पूर्ण होने पर एक डेडलॉक हो सकता है: आपका प्रोग्राम बाहरी प्रोग्राम में अधिक इनपुट लिखने का इंतजार कर रहा है, और बाहरी प्रोग्राम आपके आउटपुट बफर से पहले पढ़ने के लिए प्रतीक्षा कर रहा है।

इसे गैर-अवरुद्ध I/O का उपयोग करके हल किया जा सकता है और बफर को ठीक से प्राथमिकता दे सकता है। आप इसे स्वयं काम करने की कोशिश कर सकते हैं, लेकिन communicate() बस आपके लिए यह करता है।

+0

यूप, लेकिन हम बड़े-फिर-स्मृति-आकार डेटा से पढ़ने के बारे में बात कर रहे हैं। लेकिन स्पष्टीकरण के लिए धन्यवाद। – Almad

संबंधित मुद्दे