2013-01-15 18 views
17

मैं एक फीफो बनाते हैं, और समय-समय पर a.py से केवल पढ़ने के लिए और गैर blockingly मोड में खोलने:नामित फीफो को गैर-अवरुद्ध तरीके से कैसे पढ़ा जाए?

os.mkfifo(cs_cmd_fifo_file, 0777) 
io = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK) 
buffer = os.read(io, BUFFER_SIZE) 

b.py से, लेखन के लिए फीफो खोलें:

out = open(fifo, 'w') 
out.write('sth') 

फिर a.py एक त्रुटि उठाएगा:

buffer = os.read(io, BUFFER_SIZE) 

OSError: [Errno 11] Resource temporarily unavailable 

कोई भी जानता है कि क्या गलत है?

+1

के संभावित डुप्लिकेट [क्या स्थिति एक खोला, nonblocking नामित पाइप में परिणाम (फीफो) पढ़ने के लिए "अनुपलब्ध" होने के नाते?] (http://stackoverflow.com/questions/10021759/what-conditions-result-in-an-opened-nonblocking-named-pipe-fifo-being-unavai) हालांकि, यह प्रश्न निश्चित रूप से अभी भी उपयोगी है, क्योंकि यह अनूठा phrasing का मतलब है कि यह Google पर पहली बार मिला था। – Seanny123

+0

'नाम त्रुटि: नाम 'फीफो' परिभाषित नहीं किया गया है 'क्या आप उदाहरण को ठीक कर सकते हैं? – n611x007

उत्तर

13

read(2) की मैनपेज के अनुसार:

EAGAIN or EWOULDBLOCK 
      The file descriptor fd refers to a socket and has been marked 
      nonblocking (O_NONBLOCK), and the read would block. 
      POSIX.1-2001 allows either error to be returned for this case, 
      and does not require these constants to have the same value, so 
      a portable application should check for both possibilities. 

तो क्या आपको मिलने वाला कोई डेटा पढ़ने के लिए उपलब्ध है कि वहाँ है। import errno:

try: 
    buffer = os.read(io, BUFFER_SIZE) 
except OSError as err: 
    if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK: 
     buffer = None 
    else: 
     raise # something else has happened -- better reraise 

if buffer is None: 
    # nothing was received -- do something else 
else: 
    # buffer contains some received data -- do something with it 

सुनिश्चित करें कि आप errno आयातित मॉड्यूल किया हुआ है: यह इस तरह त्रुटि को संभालने के लिए सुरक्षित है।

+0

इसे आज़माने के बाद, a.py raise करें: अनबाउंड लॉक एरर: असाइनमेंट – chaonin

+0

@chaonin से पहले संदर्भित स्थानीय चर 'बफर' मैंने अनुमान लगाने का प्रयास किया कि कारण क्या है (मैंने पहले बफर का उपयोग नहीं किया था), और मेरा उदाहरण अपडेट किया। उम्मीद है कि अब यह और अधिक स्पष्ट है। –

+1

कब = os.open (फीफो, os.O_RDONLY | os.O_NONBLOCK) कोशिश: अगर err.errno == errno: \t बफर = os.read अं के रूप में (कब, BUFFER_SIZE) OSError छोड़कर .EAGAIN या err.errno == errno.EWOULDBLOCK: पास किसी और : उठाने अं jobs_infile = shlex.split (बफर) os.close (आईओ) – chaonin

-2
out = open(fifo, 'w') 

यह आपके लिए कौन बंद करेगा? इस द्वारा अपने खुले + लिखने बदलें:

with open(fifo, 'w') as fp: 
    fp.write('sth') 

युपीडी: ठीक है, की तुलना में सिर्फ इस बनाना:

out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY) 
os.write(out, 'tetet') 
+1

मैंने डमी कोड को धक्का नहीं दिया है ... – chaonin

+1

यह प्रश्न का उत्तर नहीं देता है, न ही यह प्रासंगिक है कि यह कोड स्पष्ट रूप से स्निपेटली है। (-1) –

+0

यदि आपका संपादन मेरी शिकायत को संबोधित करने का इरादा था, तो ऐसा नहीं हुआ। –

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