Wenn ich ein Programm habe, das eine benannte Pipe mit mkfifo erstellt und zu öffnen versucht, wie kann ich eine Pipe zum Lesen oder Schreiben öffnen, ohne sie zu blockieren?
Insbesondere schreibe ich ein C-Programm, das mit oder ohne GUI (in Java geschrieben) ausgeführt werden kann.
Im C-Programm erstelle ich erfolgreich die benannten Pipes mit mkfifo, aber wenn ich das tue
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
fopen kehrt erst zurück, wenn die GUI diese Pipe zum Schreiben öffnet. Was ich tun möchte, ist, dass diese Pipe einmal gelesen werden kann (falls) die GUI beschließt, darauf zu schreiben – ich werde den Dateideskriptor in einen Aufruf von select() einfügen. Es ist vernünftig zu erwarten, dass die Java-GUI möglicherweise nie wirklich gestartet wird, daher kann ich mich nicht darauf verlassen, dass sie das andere Ende der Pipe an einem bestimmten Punkt oder überhaupt öffnet.
Ich werde auch ein zweites Rohr zum Schreiben offen haben, und ich gehe davon aus, dass ich das gleiche Problem haben werde. Außerdem kann ich O_NONBLOCK nicht auf eine Ausgabepipe setzen, die keinen Reader hat.
Irgendwelche Vorschläge?
(Dies läuft auf einem Linux-System)
Müssen Sie die Ausgangsleitung öffnen, bevor select() auf die Eingangsleitung feuert?
– Tim Post
24. Februar 2009 um 3:47 Uhr
@tinkertim – Ich nehme an, technisch gesehen nicht – ich hatte beide in einer Setup-Funktion eingerichtet, aber ich konnte einfach zuerst die Ausgangsleitung einrichten und dann select aufrufen, warum?
– Zxaos
24. Februar 2009 um 4:47 Uhr