web-dev-qa-db-ja.com

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

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

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

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

54
Ankit

名前付きパイプ(FIFO)には  私が考えることができる3つの利点:

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

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

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

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

単方向パイプに関する上記の最後の(細かい)ポイントはLinux、POSIX( popen() を参照)に関係し、パイプは読み取り可能または書き込み可能Linuxでは一方向 。 Linux固有の詳細については、Understanding the Linux Kernel(3rd Ed。O'Reilly)を参照してください(p787)。他のOSは双方向(名前のない)パイプを提供します。

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

名前付きパイプにはTCP接続とは異なりませんが、重要な違いがあります。FIFOには永続的なファイルシステム名があるため、リーダーがなくても書き込むことができるため、書き込みはブロックされます(非同期またはノンブロッキングI/Oなし)、ただし、レシーバーが開始されていない(または再起動されている)場合にデータが失われることはありません。

参考までに、 Unixドメインソケット 、および このStackoverflow質問への回答 を参照して、メイン [〜#〜] ipc [〜#〜] メソッド、および this one について話すpopen()

41
mr.spuratic

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

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

したがって、簡単に言えば、同時に存在しない可能性のある無関係なプロセス間の通信には名前付きパイプが必要です。

15

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

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

4
Eyal

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

4
MariusMatutiae