2016-01-12 5 views
6

Ich erstellte eine Fifo-Datei mit mkfifo. Ist es möglich, das zu öffnen/zu schreiben, ohne zu blockieren? Ich wäre gern agnostisch, ob es einen Leser gibt oder nicht.Kann ich unter Linux eine Named Pipe für nicht blockiertes Schreiben in Python öffnen?

Die folgend:

with open('fifo', 'wb', 0) as file: 
    file.write(b'howdy') 

Stände nur an den offenen, bis ich ein cat fifo von einer anderen Shell. Ich möchte, dass mein Programm Fortschritte macht, unabhängig davon, ob ein Datenkonsument zusieht oder nicht.

Gibt es einen anderen Linux-Mechanismus, den ich vielleicht verwenden sollte?

Antwort

7

Von man 7 fifo:

Verfahren zur Herstellung eines FIFO in nicht-blockierenden Modus geöffnet werden kann. In diesem Fall ist das Öffnen oder Nur-Lesen erfolgreich, selbst wenn noch niemand auf der Schreibseite geöffnet hat. Das Öffnen für Nur-Schreiben wird mit ENXIO fehlschlagen (keine solche Vorrichtung oder Adresse), es sei denn, das andere Ende wurde bereits geöffnet.

Also die erste Lösung ist FIFO mit O_NONBLOCK öffnen. In diesem Fall können Sie überprüfen errno: Wenn es gleich ENXIO ist, dann können Sie versuchen, FIFO später zu öffnen.

Die andere Möglichkeit ist das Öffnen FIFO mit O_RDWR Flag. Es wird in diesem Fall nicht blockiert. Anderer Prozess kann es mit O_RDONLY ohne Problem öffnen.

import posix 
posix.open('fifo', posix.O_RDWR)