2012-04-05 7 views
12

स्थिति:पढ़ने के लिए खोले गए, नॉनब्लॉकिंग नामित पाइप (फीफो) को "अनुपलब्ध" होने के कारण क्या स्थितियां हैं?

new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO 
data = os.read(new_pipe, 1024) 

पढ़ा कभी कभी errno -11 को जन्म देती है: संसाधन अस्थायी रूप से अनुपलब्ध।

यह त्रुटि कब उठाई गई है? यह बहुत दुर्लभ प्रतीत होता है, क्योंकि आम मामले डेटा लौटाते हैं:

  • यदि कोई लेखक पाइप खोला नहीं गया है, तो खाली str ('') वापस आ गया है।
  • लेखक पाइप खोला है, लेकिन कोई डेटा फीफो में है, तो खाली str ('') भी
  • और हां लेखक फीफो में डेटा डालता है, तो के लिए वापस आ गया तो वह डेटा पढ़ा जाएगा।
+0

के संभावित डुप्लिकेट [sendto: संसाधन अस्थायी रूप से अनुपलब्ध (errno 11)] (http://stackoverflow.com/questions/5737493/ sendto-resource-temporally-अनुपलब्ध-errno-11) – agf

+0

@agf: दूसरा प्रश्न एक प्रेषण त्रुटि के बारे में है, जो ऐसा होता है क्योंकि प्रेषण बफर भरा हुआ है। इस विशेष प्रश्न का कनेक्शन सबसे अच्छा संदिग्ध है, क्योंकि हम यहां यूनिक्स पाइप पढ़ने के बारे में बात कर रहे हैं –

+0

@NiklasB। सवाल निश्चित रूप से समान नहीं है, लेकिन जवाब है। एक डुप्लिकेट के रूप में बंद करने के लिए वोटिंग अन्य प्रश्न से लिंक करने का एक सुविधाजनक तरीका था। और इसे साइडबार के शीर्ष पर लिंक करें। – agf

उत्तर

11
POSIX specification of the read system call (जोर मेरा) से

:

जब एक खाली पाइप या फीफो से पढ़ने का प्रयास: कोई प्रक्रिया पाइप लिखने के लिए खुले हैं

  • , पढ़ें () 0 से वापस-अंत-फ़ाइल को इंगित करेगा।

  • कुछ प्रक्रिया पाइप लेखन और O_NONBLOCK के लिए खुला सेट कर दिया जाता है, तो पढ़ने() लौटा देगा -1 और [EAGAIN] को errno निर्धारित किया है।

तो बुनियादी तौर पर अपनी दूसरी धारणा गलत है: लेखक पाइप खोला है, लेकिन कोई डेटा फीफो में है

हैं, तो खाली str ('') भी

दिया जाता है

यह विनिर्देश के खिलाफ होगा और मैं अपनी मशीन पर उस व्यवहार को पुन: उत्पन्न नहीं कर सकता (यह मेरे लिए EAGAIN उठाता है)। यह एक बड़ी समस्या है लेकिन नहीं है, तो आप सिर्फ अपवाद को पकड़ने और पुन: प्रयास कर सकते हैं:

import errno 

def safe_read(fd, size=1024): 
    ''' reads data from a pipe and returns `None` on EAGAIN ''' 
    try: 
     return os.read(fd, size) 
    except OSError, exc: 
     if exc.errno == errno.EAGAIN: 
     return None 
     raise 
+0

बहुत बहुत धन्यवाद। ऐसा लगता है कि वास्तव में मुझे अपने परीक्षण कोड में त्रुटियां थीं! – UsAaR33

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