146

ソケットという名前のUNIXを見た後、それらは名前付きパイプだと思いました。名前パイプを調べましたが、大きな違いは見られませんでした。私はそれらが異なって初期化されているのを見ましたが、それが私が気付く唯一のことです。どちらもCの書き込み/読み取り機能を使用し、AFAIKと同様に機能します。

UNIXドメインソケットと名前付きパイプの違いは何ですか? どちらか一方を選ぶのはいつですか?デフォルトでどちらを使用する必要がありますか (必要に応じて、deque、list、またはその他のものを使用するよりも、C++ でデフォルトでベクターを使用する方法のように)?

4

2 に答える 2

128

一般に、UNIX ドメイン ソケットは、名前付きパイプよりも柔軟です。それらの利点のいくつかは次のとおりです。

  • それらを 2 つ以上のプロセスの通信に使用できます (たとえば、複数のクライアント プロセスが接続している可能性があるサーバー プロセス)。
  • それらは双方向です。
  • プロセス間でカーネル検証済みの UID / GID 資格情報を渡すことをサポートします。
  • プロセス間でのファイル記述子の受け渡しをサポートしています。
  • これらは、パケットおよびシーケンス パケット モードをサポートします。

これらの機能の多くを使用するには、 / ではなく / ファミリのシステム コールを使用する必要がありsend()ます。recv()write()read()

于 2012-02-28T04:10:45.873 に答える
79

違いの 1 つは、名前付きパイプは一方向であるため、双方向通信を行うには 2 つ使用する必要があることです。ソケットはもちろん双方向です。1 つではなく 2 つの変数を使用する (つまり、1 つのソケットではなく 2 つのパイプを使用する) 方が少し複雑に思えます。

また、ウィキペディアの記事では、 Unix ドメイン ソケットはバイト ストリームまたはデータグラム シーケンスとして作成される場合がありますが、パイプはバイト ストリームのみです。」


実際、名前付きパイプは双方向ですが半二重です。これは、通信がエンド A からエンド B、または B から A のいずれかに進む可能性があることを意味しますが、両方が同時に行われることはありません。

于 2012-02-28T02:23:42.283 に答える