私の目標はnc
単一ですfifo
。 .).
sh
私はBashを使っているので、すべてのコマンドがPOSIXで動作するかどうかはわかりません。zsh
, ksh
, ...
以下は、タイトルに記載されている4つのコマンドです(これを行ったと仮定mkfifo fifo
)。
cat fifo | nc -l localhost 8888 > fifo
exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&-
nc -l localhost 8888 <(cat fifo) > fifo
nc -l localhost 8888 < fifo > fifo
今、私はこの4つのコマンドが同じことをしたいと思います。少なくとも最後の2つのコマンドは同じことを行います。
- 最初のコマンドは、クライアントが接続を閉じたときに閉じる単純なエコーサーバーとして期待どおりに機能します。
- 動作は1に似ています。
- サーバーに接続してデータを送信できますが、応答を受け取りません。クライアント接続を閉じると、サーバーはシャットダウンします。
- サーバーに接続できません。サーバーは引き続きリッスンします。
答え1
ここで重要なのは、FIFOを開くことがブロック操作であることです。open
両端が接続されている場合、つまりfifoが読み取りおよび書き込み用に開いている場合にのみ返されます。
Normally, opening the FIFO blocks until the other end is opened also.
最初のケースでは、シェルはパイプを実行するために分岐するため、読み取り用のFIFOを開く(cat fifo
)と書き込み用のFIFOを開く(> fifo
)は異なるプロセスで発生するため、独立して発生します。
2番目のケースでは、読み取りオープンと書き込みオープン(3<>fifo
)が1段階で発生します。
3番目の場合、<(cat fifo)
拡張子はファイル名です/dev/fd/42
。たとえばnc -l localhost 8888 /dev/fd/42 > fifo
。<
同じにするには追加の項目が必要です(例:)nc -l localhost 8888 < <(cat fifo) > fifo
。
4番目のケースでは、シェルは同じプロセスの一部として読み取り(< fifo
)のためにFIFOを開き、書き込み()のために開こうとします。> fifo
シェルは左から右に一度に 1 つずつ操作を実行します。そのため、読み取るために開こうfifo
とし、書き込みのために何かが開かれるのを待って永遠にブロックされますfifo
。この場合、nc
起動さえなく、ポートが受信用に開かないことがわかります。