2013-01-15 10 views
17

ich eine FIFO, und sie in regelmäßigen Abständen öffnen schreibgeschützt und nicht-blockierend Modus von a.py:Wie kann man FIFO nicht blockierend lesen?

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

Von b.py, die Fifo zum Schreiben öffnen:

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

Dann wird a.py einen Fehler auslösen:

buffer = os.read(io, BUFFER_SIZE) 

OSError: [Errno 11] Resource temporarily unavailable 

Wer weiß, was los ist?

+1

möglich Duplikat [Welche Bedingungen in einem geöffneten, nicht-blockierenden Rohr namens führen (Fifo) "nicht verfügbar" für die Reads?] (http://stackoverflow.com/questions/10021759/what-conditions-result-in-openopen-nonblocking-named-pipe-fifo-being-unavai) Diese Frage jedoch ist definitiv immer noch nützlich, da es eine einzigartige Formulierung bedeutet, dass es die erste war, die ich bei Google gefunden habe. – Seanny123

+0

'NameError: Name 'Fifo' ist nicht definiert' könnten Sie bitte das Beispiel beheben? – n611x007

Antwort

13

Nach der manpage von 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. 

Also, was Sie bekommen ist, dass es für das Lesen keine Daten verfügbar sind. Es ist sicher, den Fehler so zu handhaben:

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 

Stellen Sie sicher, das errno Modul haben importiert: import errno.

+0

nach dem Ausprobieren, a.py Raise: UnboundLocalError: lokale Variable 'Puffer' referenziert vor der Zuweisung – chaonin

+0

@chaonin Ich habe versucht zu raten, was der Grund ist (ich habe nicht zuvor Puffer verwendet), und aktualisiert mein Beispiel. Hoffentlich ist es jetzt klarer. –

+1

io = os.open (Fifo, os.O_RDONLY | os.O_NONBLOCK) Versuch: \t Puffer = os.read (io, BUFFER_SIZE) außer OSError als err: wenn err.errno == errno .EAGAIN oder err.errno == errno.EWOULDBLOCK: Pass sonst: Erhöhung err jobs_infile = shlex.split (Puffer) os.close (io) – chaonin

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

Wer schließt es für Sie? Ersetzen Sie Ihre offenen + Schreib durch diese:

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

UPD: Ok, als nur diese machen:

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

Ich habe den Dummy-Code nicht rausgeschoben ... – chaonin

+1

Dies beantwortet die Frage nicht, noch ist es relevant, wenn man bedenkt, dass der angegebene Code offensichtlich schnippisch ist. (-1) –

+0

Wenn Ihre Bearbeitung meine Beschwerde bearbeiten sollte, wurde sie nicht berücksichtigt. –

Verwandte Themen