もし私がしたら。
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_ONLY
RD_WR
あなたの。open
echo two
したがって、この時点でmore /tmp/a
まだFIFOを開いていない2つのプロセスを開始する準備が整いました。どちらかを配列するか、一旦more
配列すれopen(RD_ONLY)
ばランダムです。
ブロックを防ぐには、次の手順を実行します。
exec 3<> /tmp/a
まず、パイプのロックを解除してから、パイプがいっぱいになるまでブロックせずにコマンドを実行します。
ただし、上記はLinuxに適用されますが、すべてのUnixまたはUnixファミリには適用されません。 POSIXは、パイプが読み取り/書き込みモードで開かれるときの動作を指定しません。