名前なしパイプよりも名前付きパイプを使用する利点は何ですか?


51

私は、Unixの管理者から尋ねられるインタビューの質問のセットをレビューしていました。「名前付きパイプ」というトピックを見つけました。

トピックをグーグルで検索しました。ある程度までは理解できました:- 名前付きパイプ|| FIFO

しかし、この特定のタイプのパイプをいつ使用するかについての知識が不足していると感じています。名前のないパイプが機能しない特別な状況はありますか?


テクニカルフォーラムの別のリンク:writeulearn.com/category/inter-process-communicationipc

回答:


39

名前付きパイプ(fifo)には、考えられる4つの 3つの利点があります。

  • 読み取り/書き込みプロセスを同時に開始する必要はありません
  • 共通の祖先を必要しない複数のリーダー/ライターを持つことができます
  • ファイルとして、所有権と権限を制御できます
  • それらは双方向で、名前のないパイプ単方向である可能性があります *

    *)標準のシェルを考える|(いくつかのシェル、一方向であるパイプラインkshzsh、及びbash)も提供しますcoprocesses双方向通信を可能にします。POSIXはパイプを半二重として扱います(つまり、両側で読み取りまたは書き込みのみが可能)。pipe()システムコールは2つのファイルハンドルを返し、一方を読み取り専用として、もう一方を書き込み専用として扱う必要があります。一部の(BSD)システムは、読み取りと書き込みを同時にサポートしています(POSIXで禁止されていません)。pipe()popen()および場合によってはpopen2()manページを確認してください。無指向性は、パイプに名前が付けられているかどうかに依存しない場合がありますが、Linux 2.6では依存しています。

(更新、Stephane Chazelasからのフィードバックのおかげで)

したがって、名前のないパイプでは達成できない明白なタスクの1つは、従来のクライアント/サーバーアプリケーションです。

単一方向パイプに関する上記の最後の(打撃を受けた)ポイントはLinuxに関連しています。POSIX(参考文献を参照popen())は、パイプは読み取りまたは書き込み可能であればよくLinuxでは単一方向であると言います。参照してくださいLinuxカーネルの理解 Linux固有の詳細については、(第3版。オライリー)(p787)を。他のOSは双方向(名前のない)パイプを提供します。

例として、Nagiosはコマンドファイルに fifoを使用します。さまざまな外部プロセス(CGIスクリプト、外部チェック、NRPEなど)がこのfifoにコマンド/更新を書き込み、これらは永続的なNagiosプロセスによって処理されます。

名前付きパイプにはTCP接続と似た機能がありますが、重要な違いがあります。fifoには永続的なファイルシステム名があるため、リーダーがない場合でも書き込むことができます。確かに、書き込みがブロックされます(非同期または非ブロッキングI / Oなし)。開始済み(または再起動中)。

参考のため、も参照のUNIXドメインソケット、との答えこのStackOverflowの質問メインまとめたIPCの方法を、そしてこの1について語りますpopen()


2
名前のないパイプで複数のリーダー/ライター使用することもできます。Linuxでは、これらはunamedパイプよりも双方向ではありません。書き込み側と読み取り側があり、データは一方向にのみ流れます。書き込みモードでfifoを開くと、書き込み終了、読み取りモードで読み取り終了、rwモードで書き込み終了に書き込み、読み取りから読み取ります。これは、双方向パイプまたはUNIXドメインソケットとは異なります。実際には、各方向に2つの別々のデータフローがあります。
ステファンシャゼル

@StephaneChazelasフィードバックに感謝します。回答をより具体的に更新し、パイプと方向性を明確にします(願っています)。
mr.spuratic

名前付きパイプへの通信にはディスクIOが含まれますか?それとも、すべてインメモリですか?これらのIPCメカニズムのパフォーマンスエンベロープを決定するものは何ですか?
CMCDragonkai

15

名前のないまたは匿名のパイプは、親子関係、またはシェルなどのパイプを提供する共通の親の子のいずれかによって関連付けられた異なるプロセス間の1対1の一方向のプロセス間通信の手段を提供します処理する。プロセスは関連しているため、パイプへのファイル記述子の関連付けは暗黙的であり、プロセスの外部にある名前のオブジェクトを必要としません。名前のないパイプは、それを使用するプロセスがパイプへのオープンファイル記述子を保持している場合にのみ存在します。プロセスが終了し、OSがプロセスに関連付けられたすべてのファイル記述子を閉じると、名前のないパイプが閉じられます。

名前付きパイプは実際にはFIFOです。これらは、ファイルシステム内のノードによって表される永続オブジェクトです。名前付きパイプは、必ずしも関連しておらず、同時に存在する必要のない1つ以上のプロセス間で多対多の双方向通信を提供します。パイプのファイル名は、通信のためのプロセス間のアドレスまたはコントラクトとして機能します。1つのプロセスのみが名前付きパイプに書き込み、他の1つのプロセスが名前付きパイプから読み取る場合、名前付きパイプは、2つの関連プロセス間の名前のないパイプと同じように動作します。

簡単な答えは、同時に存在しないかもしれない無関係なプロセス間の通信のために名前付きパイプが必要だということです。


+1プロセスはほぼ同時に存在していると思います(そうでなければ、パイプは少し無意味です-ただ普通のファイルに物を置いておくこともできます)。これらおよびUNIXドメインソケットは、コマンドラインなどから制御できるデーモンサービスでよく使用されます。あなたが見れば/run、Linuxのデスクトップシステムにあなたはおそらく(という名前のFIFOとUnixソケット)の両方のいくつかを見つけることができます。これはIPCの形式です。
goldilocks

2
@goldilocks:名前付きパイプは一般に、組み込みシステムのプロセス間でメモリ常駐のアドホックメールボックスとして使用されます。通信プロセスは短命で、同時に存在しません。利点は、実装が共有メモリIPCと比べて単純であり、RAMのみが使用されるという事実です。欠点は、ブート間の永続性とパイプのバイト単位のFIFOの性質と、共有メモリを備えた構造を使用する能力です。
ジョナサンベンアブラハム

@jonathan:+1、いくつか疑問があります。-名前付きパイプをFIFOと呼ぶのはなぜですか。永続オブジェクトとは何ですか?
アンキット

@Ankit:名前付きパイプをFIFOと呼ぶ人もいます。これはFIFOがFIFOデータ構造のように振る舞うためです。特に、単一プロセスによる読み取りと書き込みの両方のために開かれた場合。「永続オブジェクト」とは、名前付きパイプがファイルシステムオブジェクトに関連付けられていることを意味します。つまり、名前の付いたファイルの一種であり、メディアに保存されている他のファイルと同じ永続性を持ちます。
ジョナサンベンアブラハム

4

他で言及されていない利点の1つは、名前付きパイプをファイルのみが実行される場所で使用できることです。

たとえば、一部のメールクライアントには、〜/ .signatureの内容をすべてのメールメッセージに追加する機能があります。.signatureがコマンドラインオプションである場合、またはメールクライアントが.signatureが実行可能であることを認識して実行できる場合、名前付きパイプは必要ありません。ただし、メールクライアントがそれほど洗練されていない場合は、.signatureという名前のパイプを作成し、ファイルが読み取られるたびに新しい署名を生成するアプリケーションを実行できます。


面白い。そのようなアプリケーションはありますか?FIFOがいつアクセスされたかを確認するには、カーネルレベルで監視する必要があるようです。
ワイルドカード

4

名前付きパイプには別の利点があります異なるシステム間で使用できます。異なるマシンで実行されている2つのプロセスのリアルタイム通信が必要だとします。次に、2つの間でフォルダーを共有し、FIFOをフォルダーに入れて、外に出ます。ファイルで動作するように設計されたアプリケーションをポートでリッスンするサービスに変換するよりもかなり簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.