2011-06-05 13 views
10

मैं नामित पाइप का उपयोग कर एक डेमॉन और क्लाइंट के बीच दो तरह के संचार को स्थापित करने की कोशिश कर रहा हूं। इनपुट के लिए इस्तेमाल किए गए नामित पाइप को खोलने का प्रयास करते समय कोड लटकता है क्यों?पायथन नाम पाइप समस्या

class comm(threading.Thread): 

def __init__(self): 
    self.srvoutf = './tmp/serverout' 
    self.srvinf = './tmp/serverin' 
    if os.path.exists(self.srvoutf): 
     self.pipein = open(self.srvoutf, 'r') 
     #-----------------------------------------------------Hangs here 
    else: 
     os.mkfifo(self.srvoutf) 
     self.pipein = open(self.srvoutf, 'r') 
     #-----------------------------------------------------or here 
    if os.path.exists(self.srvinf): 
     self.pipeout = os.open(self.srvinf, os.O_WRONLY) 
    else: 
     os.mkfifo(self.srvinf) 
     self.pipeout = os.open(self.srvinf, os.O_WRONLY) 

    threading.Thread.__init__ (self) 
+1

संबंधित पाठक या लेखक कनेक्ट होने तक पाइप ब्लॉक को पढ़ता है और लिखता है – tMC

+0

धन्यवाद, यहां अधिक खुदाई के बाद भी एक इंडिपथ स्पष्टीकरण है http://stackoverflow.com/questions/5782279/python-why-does-aread -ऑन-ओपन-ऑफ-ए-नामित-पाइप-ब्लॉक –

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/5782279/python-why-does-a-read-only-open-of-a-named-pipe -block। संपादित करें: जैसा कि आप मेरी टिप्पणी टाइप करते समय पता चला है। – andrewdski

उत्तर

12
specification for open() से

:

जब O_RDONLY या के साथ एक फीफो O_WRONLY सेट खोलने:

O_NONBLOCK सेट है, तो एक खुला() के लिए पढ़ने-केवल बिना लौटा देगा देरी। के लिए एक खुला() लिखने के लिए केवल कोई त्रुटि नहीं लौटाएगी, वर्तमान में कोई फ़ाइल पढ़ने के लिए फ़ाइल खोलती है।

तो O_NONBLOCK स्पष्ट है, एक खुला() के लिए पढ़ने-केवल जब तक एक धागा लिखने के लिए फ़ाइल खोलता बुला धागा ब्लॉक करेगा। के लिए एक खुला() केवल पढ़ने के लिए थ्रेड को अवरुद्ध कर देगा जब तक कोई थ्रेड फ़ाइल पढ़ने के लिए फ़ाइल खोलता है।

दूसरे शब्दों में, जब आप पढ़ने के लिए नामित पाइप खोलते हैं, तो डिफ़ॉल्ट रूप से खुले रहेंगे जब तक कि पाइप के दूसरी तरफ लेखन के लिए खोला नहीं जाता है। इसे ठीक करने के लिए, os.open() का उपयोग करें और नामित पाइप के पढ़ने वाले पक्ष पर os.O_NONBLOCK पास करें।

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