web-dev-qa-db-ja.com

パイプとソケットの違いは何ですか?

いくつかの答えを見つけましたが、それらは特にWindowsマシンに関連しているようです。だから私の質問は、パイプとソケットの違いは何ですか、いつ/どのように他のものを選択する必要がありますか?

52
bot_bot

パイプとソケットの違いは何ですか?いつ、どのようにどちらを選択する必要がありますか?

パイプとソケットの両方がバイトストリームを処理しますが、異なる方法で処理します...

  • パイプは特定のホスト内にのみ存在し、仮想ファイル間のバッファリング、またはそのホスト内のプロセスの出力/入力の接続を指します。パイプ内のパケットの概念はありません。
  • ソケットは、IPv4またはIPv6を使用して通信をパケット化します。その通信はローカルホストを超えて拡張できます。ソケットの異なるエンドポイントが同じIPアドレスを共有できることに注意してください。ただし、そうするためには、異なるTCP/UDPポートでリッスンする必要があります。

使用法

  • パイプを使用:
    • 特定のサーバー内でファイルとしてデータを読み書きする場合。 Cを使用している場合、read()およびwrite()をパイプに接続します。
    • あるプロセスの出力を別のプロセスの入力に接続する場合... popen() を参照してください
  • ソケットを使用して、異なるIPv4/IPv6エンドポイント間でデータを送信します。多くの場合、これは異なるホスト間で発生しますが、同じホスト内でソケットを使用できます

ところで、ソケットをパイプに結合するには netcat または socat を使用できます。

67
Mike Pennington

Mikeの答えを完成させるために、UNIXドメインソケットの存在に言及することが重要です。UNIXドメインソケットは、POSIX準拠のオペレーティングシステムで利用できます。使用セマンティクスの点では「通常の」インターネットソケットに非常に似ていますが、それらはマシンに対して純粋にローカルであり(もちろんインターネットソケットもローカルで動作します)、したがってパイプのようにほとんど動作します。ほとんどの場合、UNIXパイプは定義上単方向であるためです。

パイプとFIFO(名前付きパイプとも呼ばれます)は、単方向のプロセス間通信チャネルを提供します。パイプには、読み取り終了と書き込み終了があります。パイプの書き込み側に書き込まれたデータは、パイプの読み取り側から読み取ることができます。 ( manページpipe(7) からの抜粋)

UNIXドメインソケットには、データの他にファイル記述子の送信も許可されるため、非常に珍しい機能もあります。この方法では、非特権プロセスは、ソケットを介して記述子が送信されました。ウィキペディアによると、この手法はClamAVウイルス対策スキャンデーモンによって使用されます。

20
Ale