web-dev-qa-db-ja.com

Linux Bashで名前付きパイプを使用する例

LinuxのBashで名前付きパイプを使用する簡単な例を投稿できますか?

51
Drew LeSueur

名前付きパイプの実際の使用の最良の例の1つ...

http://en.wikipedia.org/wiki/Netcat から:

別の便利な動作は、netcatをプロキシとして使用することです。ポートとホストの両方をリダイレクトできます。この例を見てください:

nc -l 12345 | nc www.google.com 80

ポート12345は要求を表します。

これにより、ポート12345でncサーバーが起動し、すべての接続がgoogle.com:80にリダイレクトされます。 Webブラウザーがncに要求を行うと、要求はgoogleに送信されますが、応答はWebブラウザーに送信されません。これは、パイプが単方向であるためです。これは、入力と出力をリダイレクトする名前付きパイプで回避できます。

mkfifo backpipe
nc -l 12345  0<backpipe | nc www.google.com 80 1>backpipe
84
Brian Clements

2つの異なるシェルを開き、それらを並べたままにします。両方で、/tmp/ディレクトリに移動します。

cd /tmp/

最初のタイプでは:

mkfifo myPipe
echo "IPC_example_between_two_shells">myPipe

2番目の行では、次を入力します。

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe

最初のシェルでは、2番目のシェルでコードの2番目の部分を実行するまで、プロンプトは表示されません。 fifoの読み取りと書き込みがブロックされているためです。

ls -al myPipeを実行してFIFOタイプを確認し、この特定のタイプのファイルの詳細を確認することもできます。

次のステップは、コードをスクリプトに組み込むことです!

29
Nicolas Mas

コマンドは次のとおりです。

$ mkfifo named_pipe

$ echo "Hi" > named_pipe &

$ cat named_pipe

最初のコマンドはパイプを作成します。

2番目のコマンドは、パイプに書き込みます(ブロッキング)。 &はこれをバックグラウンドに配置するため、同じシェルでコマンドを入力し続けることができます。次のコマンドでFIFOが空になったときに終了します。

最後のコマンドはパイプから読み取ります。

27
Khaled

ターミナル1:

$ mknod new_named_pipe p
$ echo 123 > new_named_pipe
  • ターミナル1は名前付きパイプを作成しました。
  • エコーを使用してデータを書き込みました。
  • 受信側が存在しないためブロックされます(名前付きパイプと名前なしパイプの両方で受信と書き込みが終了する必要があるため)

ターミナル2:

$ cat new_named_pipe
$ 123
$ 
  • ターミナル2から、データの受信側が追加されます。
  • Catを使用してその中のデータを読み取ります。
  • new_named_pipeには受信側と書き込み側の両方が存在するため、情報とブロッキング停止が表示されます

名前付きパイプはLinuxのあらゆる場所で使用されます。ls -lコマンドで表示されるcharおよびblockファイルのほとんどは、charおよびblockパイプです(これらはすべて/ devにあります)。これらのパイプは、ブロックおよび非ブロックにすることができ、主な利点は、IPCの最も簡単な方法を提供することです。

2