mkfifoがLIFOのように動作するのはなぜですか?

mkfifoがLIFOのように動作するのはなぜですか?

もし私がしたら。

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

他の端末でしばらく

echo 'two'>/tmp/a

第3ターミナルで

more /tmp/a

最後のコマンドの出力を取得するのはなぜですか?

two
one

答え1

存在する

echo 'one' > /tmp/a

シェルはopen(O_WRONLY)パイプでアクションを実行し、それを作成してecho実行しますwrite("one\n")

open他のプロセスがパイプを開くまでブロックされます。RD_ONLYRD_WR

あなたの。openecho two

したがって、この時点でmore /tmp/aまだFIFOを開いていない2つのプロセスを開始する準備が整いました。どちらかを配列するか、一旦more配列すれopen(RD_ONLY)ばランダムです。

ブロックを防ぐには、次の手順を実行します。

exec 3<>  /tmp/a

まず、パイプのロックを解除してから、パイプがいっぱいになるまでブロックせずにコマンドを実行します。

ただし、上記はLinuxに適用されますが、すべてのUnixまたはUnixファミリには適用されません。 POSIXは、パイプが読み取り/書き込みモードで開かれるときの動作を指定しません。

関連情報