Warum verhält sich mkfifo wie ein LIFO?

7

Wenn ich mache.

mkfifo /tmp/a
echo 'one'>/tmp/a

in der Zwischenzeit von einem anderen Terminal

echo 'two'>/tmp/a

und von einem dritten Terminal

more /tmp/a

Warum erhalte ich als Ausgabe des letzten Befehls dies?

two
one
Sleax
quelle

Antworten:

8

Im

echo 'one' > /tmp/a

Die Shell macht ein open(O_WRONLY)auf der Pipe und spawnt echodann, was dann das macht write("one\n").

Das openwird blockiert, bis ein anderer Prozess die Pipe in RD_ONLYoder RD_WRobwohl öffnet .

Und das wird auch openvon 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 moresich 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.

Stéphane Chazelas
quelle