Antworten:
Im
echo 'one' > /tmp/a
Die Shell macht ein open(O_WRONLY)
auf der Pipe und spawnt echo
dann, was dann das macht write("one\n")
.
Das open
wird blockiert, bis ein anderer Prozess die Pipe in RD_ONLY
oder RD_WR
obwohl öffnet .
Und das wird auch open
von dir echo two
.
In dem Moment, in dem Sie dies tun more /tmp/a
, sind zwei Prozesse bereit, die das FIFO noch nicht geöffnet haben, geschweige denn etwas darauf geschrieben haben. Welche dieser beiden wird so bald geplant werden , wie more
sich das open(RD_ONLY)
geht zufällig sein.
Um ein Blockieren zu vermeiden, können Sie Folgendes tun:
exec 3<> /tmp/a
Um zuerst die Pipe zu entsperren und dann Ihre Befehle auszuführen, die erst blockiert werden, wenn die Pipe voll ist.
Beachten Sie jedoch, dass das oben Genannte unter Linux funktioniert, jedoch nicht unter jedem Unix oder Unix-ähnlichen. Das Verhalten beim Öffnen einer Pipe im Lese- / Schreibmodus wird von POSIX nicht angegeben.