私はしばらくそれを操作するために努力してきたので、配管がどのように機能するかについての根本的な誤解が私の問題の根本的な原因であると思います。
私の目標は、いくつかのリモートホストへのTCP接続を開始しnetcat
、ファイルシステムに2つの名前付きパイプを持つことです。あるプロセスは着信データを読み取ることができ、もう一方のプロセスは発信データとして書き込むことができます。現在、次の構造を使用しています。
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
ここでは、他のプロセスがこのオープンTCP接続を読み書きできるようにしたいと思います。これが「ただ動作」する必要がありますか、それともこのような設定が機能しないのですか?
何〜らしい現在起こっていることはout
問題なく読むことができますが、書き込むとin
パイプが切れたという内容の出力が出て以来のすべての通信が中断されたようです。アイデア?
(関連:元々使用したもの:
netcat foo.bar.org 4000 < out > in &
しかし、入力待機をブロックすることがわかりました。私もこれについて疑問に思います。しかし、別の質問で解決するのが最善です。 )
答え1
cat out | netcat foo.bar.org 4000 > in &
問題はcat
、一度パイプEOF
からout
受信すると終了することです。終了すると、残りcat
のパイプライン(含むnetcat
)も終了します。
次のようにしてみてください。
while true; do cat out; done | netcat foo.bar.org 4000 > in &
したがって、cat
必要に応じて頻繁に再開され、パイプラインEOF
で発生するすべての問題がout
効率的に処理されます。
答え2
私もこの問題に直面しました。主な問題はですnetcat
。これは素晴らしいツールですが、入力または出力ファイル記述子のいずれかが閉じられたときに接続を閉じます。サーバーがリッスンしていない場合は何もしません。他のピアがダウンすると終了します。サーバーを正しく設定し、ファイル記述子を開いたままにしておくだけで機能します。たとえば、次のシナリオをテストしましたが、完全に機能しました。端末にエコサーバーを設定する(私は次のように設定しました):
mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF
次に、別の端末でfifoを設定してサーバーに接続します。
mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &
サーバーが送信するすべての内容を印刷して実行し続けます。アプリケーションがin
シャットダウンしたときに一端を閉じるためにアプリケーションがfifoを使用している場合は、接続をnetcat
閉じます。
cat in &
そして同じ端末で:
cat > out
これで、入力した内容が再印刷されます(Enterキーを押した後)。このコマンドを閉じると、接続も閉じます。
答え3
Steven Mondayの分析は私にとって良く見えます。 fifoはcat
最初の書き込み後の戻り値です。これを防ぐための解決策は、書き込みモードでFIFOを開くプロセス(たとえば、次の例の最初のプロセス)を維持することです。out
empty
cat
mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &
(out-pidファイルはすべてを停止します。kill -9 $(cat out-pid)
)
他の例ここ。