Wie führe ich ein nicht blockierendes fopen auf einer Named Pipe (mkfifo) aus?
Wenn ich ein Programm, das erstellt und versucht, öffnen Sie eine named pipe mit mkfifo, wie kann ich öffne eine pipe zum Lesen oder schreiben, ohne zu blockieren?
Speziell, ich Schreibe ein C Programm, welches ausgeführt werden kann, mit oder ohne gui (in Java geschrieben).
Im C-Programm habe ich erfolgreich erstellen von named pipes mit mkfifo, aber wenn ich
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
fopen nicht zurück, bis sich die GUI öffnet, dass eine pipe zum schreiben. Was ich tun möchte, ist, dass die Leitung bereit sein, einmal gelesen (wenn) die GUI entscheidet, zu schreiben - ich werde es sein, den file-descriptor in einer select () - Aufruf. Es ist vernünftig, zu erwarten, dass die java-GUI kann eigentlich nie gestartet werden, so kann ich nicht verlassen sich auf Sie zum öffnen das andere Ende des Rohres an einem bestimmten Punkt oder sogar an allen.
Ich werde auch eine zweite pipe zum schreiben geöffnet, und ich nehme an, ich habe das gleiche problem. Weiter kann ich nicht O_NONBLOCK auf eine output-pipe, die hat keine Leser.
Irgendwelche Vorschläge?
(Diese läuft auf einem linux-system)
InformationsquelleAutor der Frage Zxaos | 2009-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man
open()
Ihrer PfeifeO_RDONLY | O_NONBLOCK
und wenn Sie möchten, dass das C-stream ist, kannst du es mitfdopen()
. Allerdings könnte es ein problem mit derselect()
- AFAIK ein pipe-fd zum Lesen geöffnet ist, hat kein Schriftsteller ist immer bereit zum Lesen, undread()
gibt 0 zurück, so dass dieselect()
würde Feuer auf unbestimmte Zeit.Einem notdürftigem der Weg der überwindung dieser würde sein, öffnen Sie das Rohr
O_RDWR
; das heißt, mindestens einen writer haben (C++ Programm). Das würde Ihr problem lösen sowieso.InformationsquelleAutor der Antwort jpalecek