UNIXドメインソケットVS名前付きパイプ?


122

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

UNIXドメインソケットと名前付きパイプの違いは何ですか?いつ他のものを選ぶのですか?デフォルトでどちらを使用する必要がありますか?

c  linux 

1
@GregHewgill:残念ながら、その質問は、私が尋ねている違いではなく、「IPCとは何か」に関するものです。投稿する前にそれを確認しましたが、リンクして関連性があると言った方がいいですか?(私には

1
@acid:はい、関連する質問をリンクし、まだある質問を説明することは常に良い考えです。
Ben Voigt

3
この記事はそれをかなりうまくまとめました。Unixドメインソケットの謎を解く
Cong Ma

リンク切れ:techdeviancy.com/uds.html
mcdado

回答:


106

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

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

これらの機能の多くを使用するには、使用する必要がsend()/ recv()ではなく、システムコールの家族write()/をread()


11
一方、名前パイプには通常のopen(2)呼び出しを介して「接続」できるという利点があるため、通常はファイル名引数のみを取るプログラム間でアドホックパイプラインを構築するのに適しています。
Dolda2000 2016年

66

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

また、Wikipediaの記事は次の点でかなり明確です。「パイプはバイトストリームのみであるのに対し、Unixドメインソケットはバイトストリームまたはデータグラムシーケンスとして作成される場合があります。」


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


1
うーん面白い+1。バイトストリームとデータグラムの違いを偶然知っていますか?たぶん、あなたがこの質問に対してすでに行ったような1つまたは2つの文の例ですか?

7
@acidzombie:データグラムモードのパイプまたはソケットは境界を維持するため、1つのwrite呼び出しで1つの呼び出しが生成されreadます。ストリームモードでは、データを1つの長いストリームに連結できるため、一度に多くの書き込みを読み取ることができます。(jtoberonの回答によると、Windowsにはデータグラムパイプがあります。Unixにはありません)
Ben Voigt

1
@BenVoigtよく、データグラムソケットパケットの配信は信頼できないため、書き込みが必ずしも読み取り呼び出しを生成するわけではありません。おそらくローカルソケットですが、コメントからは明らかではありません。ですから、問題があります。
xaxxon

3
@xaxxon:パイプとUNIXドメインソケットの両方がローカルであるため、レシーバーはキューをまったく空にしています。
Ben Voigt 2013

6
はい、UDP とは異なり、データグラムのUnixドメインソケットは、順序どおりの配信が保証されています。
jtchitty 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.