名前付きパイプへのファイルリダイレクトは機能しませんが、catへのパイピングが機能するのはなぜですか?

名前付きパイプへのファイルリダイレクトは機能しませんが、catへのパイピングが機能するのはなぜですか?

これはncを使用するUnixのシンプルなエコーサーバーです。

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(目安としてこれ)

私はビューのデータフローは次のように動作します。

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

問題は、これがなぜ機能しないのかです。

nc -k -l 4458 -v >fifo <fifo

telnetを開こうlocalhostとすると、4458「接続拒否」エラーが発生することがわかります。

ベストアンサー1

これは、netcatコマンドがまだ起動していないためです!入力用にFIFOを開こうとすると、シェルがブロックされます。努力する

strace cat >fifo <fifo

あなたは何も見ることができません。代わりに、以下を使用してください。

nc -k -l 4458 -v <>fifo >&0

標準入力として読み書きするためにfifoを開き、それを標準出力にコピーします。


完全なbashコマンドを追跡すると、読み取りオープンまたは書き込みオープンが返されないことがわかります(反対のオープンが完了するまで)。

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo:読み取り用にFIFOを開くと、通常、他のプロセスが書き込み用に同じFIFOを開くまでブロックされるか、その逆も同様です。

おすすめ記事