私は、Unixの管理者から尋ねられるインタビューの質問のセットをレビューしていました。「名前付きパイプ」というトピックを見つけました。
トピックをグーグルで検索しました。ある程度までは理解できました:- 名前付きパイプ|| FIFO
しかし、この特定のタイプのパイプをいつ使用するかについての知識が不足していると感じています。名前のないパイプが機能しない特別な状況はありますか?
私は、Unixの管理者から尋ねられるインタビューの質問のセットをレビューしていました。「名前付きパイプ」というトピックを見つけました。
トピックをグーグルで検索しました。ある程度までは理解できました:- 名前付きパイプ|| FIFO
しかし、この特定のタイプのパイプをいつ使用するかについての知識が不足していると感じています。名前のないパイプが機能しない特別な状況はありますか?
回答:
名前付きパイプ(fifo)には、考えられる4つの 3つの利点があります。
それらは双方向で、名前のないパイプは単方向である可能性があります *
*)標準のシェルを考える
|
(いくつかのシェル、一方向であるパイプラインksh
、zsh
、及び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()
名前のないまたは匿名のパイプは、親子関係、またはシェルなどのパイプを提供する共通の親の子のいずれかによって関連付けられた異なるプロセス間の1対1の一方向のプロセス間通信の手段を提供します処理する。プロセスは関連しているため、パイプへのファイル記述子の関連付けは暗黙的であり、プロセスの外部にある名前のオブジェクトを必要としません。名前のないパイプは、それを使用するプロセスがパイプへのオープンファイル記述子を保持している場合にのみ存在します。プロセスが終了し、OSがプロセスに関連付けられたすべてのファイル記述子を閉じると、名前のないパイプが閉じられます。
名前付きパイプは実際にはFIFOです。これらは、ファイルシステム内のノードによって表される永続オブジェクトです。名前付きパイプは、必ずしも関連しておらず、同時に存在する必要のない1つ以上のプロセス間で多対多の双方向通信を提供します。パイプのファイル名は、通信のためのプロセス間のアドレスまたはコントラクトとして機能します。1つのプロセスのみが名前付きパイプに書き込み、他の1つのプロセスが名前付きパイプから読み取る場合、名前付きパイプは、2つの関連プロセス間の名前のないパイプと同じように動作します。
簡単な答えは、同時に存在しないかもしれない無関係なプロセス間の通信のために名前付きパイプが必要だということです。
/run
、Linuxのデスクトップシステムにあなたはおそらく(という名前のFIFOとUnixソケット)の両方のいくつかを見つけることができます。これはIPCの形式です。
他で言及されていない利点の1つは、名前付きパイプをファイルのみが実行される場所で使用できることです。
たとえば、一部のメールクライアントには、〜/ .signatureの内容をすべてのメールメッセージに追加する機能があります。.signatureがコマンドラインオプションである場合、またはメールクライアントが.signatureが実行可能であることを認識して実行できる場合、名前付きパイプは必要ありません。ただし、メールクライアントがそれほど洗練されていない場合は、.signatureという名前のパイプを作成し、ファイルが読み取られるたびに新しい署名を生成するアプリケーションを実行できます。