
これは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を開くまでブロックされるか、その逆も同様です。