wie man bestimmt, ob eine Pipe geschrieben werden kann

8

Gibt es einen Weg (in C oder vorzugsweise in Perl) zu bestimmen, ob eine Named Pipe geschrieben werden kann - d. h. es gibt einen aktiven Lesevorgang Es scheint, dass, wenn ich zum Schreiben nonblocking öffnen, die offene sofort zurückgibt, sondern eine Auswahl für schreiben auch sofort zurückkehrt. Das Ziel besteht darin, dass der Schreibprozess einfach weiterläuft (d. H. Das Senden überspringt), wenn das Leseende nicht bereit ist

    
user1938139 19.12.2013, 16:45
quelle

3 Antworten

4

Es besteht die Möglichkeit, dass Sie die Rückkehrcodes von open nicht beachten. Wenn Sie einen FIFO zum Schreiben von und als nicht blockierend öffnen, gibt es zwei mögliche Ergebnisse.

  1. Wenn bereits ein Leser vorhanden ist, wird% code_% sofort erfolgreich zurückgegeben.

  2. Wenn es keinen Pipe Reader gibt, wird open mit errno = ENXIO fehlschlagen.

Das folgende Programm demonstriert.

%Vor%

Die Tatsache, dass open fehlschlägt, ohne blockiert zu werden, ist jedoch nicht sehr nützlich. Über das einzige, was Sie tun können, ist kontinuierlich zu versuchen, zu öffnen, bis Sie Erfolg haben und diese Art der Umfrage kann verschwenderisch sein, und im Kontext eines lang laufenden Programms Warten auf intermittierende Leser ist irgendwie lächerlich.

Eine Lösung ist die oben verwendete - öffnen Sie den FIFO zum Lesen selbst - aber das hat seine eigenen Probleme.

  1. Wenn Sie Ihren FIFO-Befehl fd in Ihrer open -Anweisung verwenden, wird er immer beschreibbar sein ... bis nicht. Das heißt, weil Sie auch Ihr eigener Leser sind, werden die FIFO-Schreibvorgänge erfolgreich ausgeführt, bis Sie den FIFO-Puffer mit PIPE_BUF-Bytes füllen. Danach wird der FIFO nicht beschreibbar sein und Ihre Schreibvorgänge werden mit EAGAIN fehlschlagen, bis ein legitimer Leser (d. H. Nicht Sie selbst) vorbeikommt, zum Lesen öffnet und beginnt, den Puffer zu leeren.

  2. Wenn Sie Ihren eigenen FIFO zum Lesen und Schreiben öffnen, sehen Sie keinen EOF von legitimen Benutzern, wenn sie den FIFO schließen. Da Sie nur über das Schreiben besorgt sind, ist das möglicherweise kein Problem für Sie.

Eine andere mögliche Lösung, die ich noch nie ausprobiert habe, ist die Verwendung von inotify in Ihrem FIFO. Sie können den Inotify-Dateideskriptor in Ihrem select überwachen und feststellen, wann jemand den FIFO geöffnet hat. Dann weißt du, dass du dein Ende sicher zum Schreiben öffnen kannst. Wahrscheinlich möchten Sie offene Berechtigungen für den FIFO maskieren, so dass Sie der einzige Schreiber sein können, wenn möglich für Ihre Anwendung.

FIFOs sollten in PITAs für diese funkige Semantik umbenannt werden. Wenn du die Veränderung vornehmen kannst, haben die Unix-Götter uns Sterblichen Domain-Sockets geschenkt.

    
Duck 20.12.2013 00:40
quelle
3

Das Öffnen der Schreibseite einer Pipe wird blockiert, bis ein Leser die Leseseite öffnet, unabhängig von anderen Einstellungen. Sie können also nicht von open zurückkehren, bis die Pipe verbunden ist.

Wenn ein Leser seine Seite eines bereits geöffneten Rohrs schließt, erhält der Schreiber E_PIPE beim nächsten Schreibversuch. Soweit ich feststellen konnte, ist dies der einzige Hinweis darauf, dass eine Pipe nicht mehr verbunden ist.

    
Jim Garrison 19.12.2013 16:58
quelle
0

es scheint, dass - ohne Chance für den Autor zu überprüfen, diese Strategie funktioniert: Öffnen Sie nonblocking, dann schreiben Sie einfach - unabhängig davon, ob Sie den Modus auf Blockierung oder nicht nach dem Öffnen ändern, der Schreibvorgang scheint erfolgreich zu sein (der Writer wird einfach weitermachen, wenn der Leser nicht wirklich wartet)

    
user1938139 19.12.2013 23:17
quelle

Tags und Links