Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

ネームドパイプ(ネイムドパイプ)とは | 意味や読み方など丁寧でわかりやすい用語解説

ネームドパイプ(ネイムドパイプ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

名前付きパイプ (ナメドパイプ)

英語表記

named pipe (ネイムドパイプ)

用語解説

ネームドパイプは、オペレーティングシステムが提供するプロセス間通信(IPC: Inter-Process Communication)のメカニズムの一つである。これは、互いに無関係なプロセス同士がデータを交換するための手段であり、その名の通り「名前」を持つことが最大の特徴だ。通常の匿名パイプが親子関係にあるプロセス間でのみ利用可能で一時的なのに対し、ネームドパイプはファイルシステム上に名前を持つ特殊なファイルとして振る舞うため、全く異なるプロセス間で通信が可能となる。この特性から、ネームドパイプは主にサーバーとクライアントのような関係にあるプロセスが、同一のコンピュータ上でデータを送受信する際に利用される。

プロセス間通信とは、コンピュータ上で同時に動作する複数のプロセスが、互いに協調して処理を進めるために情報やデータをやり取りする仕組み全般を指す。ネームドパイプは、このIPCを実現するさまざまな手法の中の一つであり、特にストリーム指向のデータ転送に適している。

ネームドパイプの基本的な概念は、パイプ(管)に似ている。データを一方の端から書き込むと、もう一方の端から読み出すことができるという、一次元的なデータの流れを表す。これはキュー(待ち行列)のような動作をイメージすると理解しやすい。

匿名パイプとネームドパイプの最も大きな違いは、その「名前」の有無にある。匿名パイプは通常、プログラム内部で一時的に生成され、そのパイプを作成したプロセスと、その子プロセスなどの直接的な関係を持つプロセスとの間でしか通信できない。また、匿名パイプはプロセスが終了すると消滅する一時的な存在である。

一方、ネームドパイプはファイルシステム上に「名前付きパイプファイル」として作成される。例えば、Windows環境では\\.\pipe\MyPipeのような形式で、Unix/Linux環境では/tmp/my_fifoのような通常のファイルパスとして表現される。この名前があるため、通信を行いたいプロセスは、その名前(パス)を知っていれば、互いに何の関連性もなくてもパイプを開いて通信を開始できる。これは、ファイルを開いて読み書きする操作と似ている。

ネームドパイプの特性として、以下の点が挙げられる。

第一に、ファイルシステム上の存在であるため、「永続性」を持つ。ここでいう永続性とは、パイプ自身がデータ保持の永続性を持つという意味ではなく、パイプの名前(パス)がプロセス終了後もファイルシステム上に残り続けるという意味である。そのため、不要になった際には明示的に削除する必要がある。

第二に、サーバー・クライアントモデルでの利用に適している。一般的に、一方のプロセスがネームドパイプを作成し、クライアントからの接続を待つ「サーバー」として振る舞う。他方のプロセスは、そのパイプ名を指定してパイプを開き、データ送受信を行う「クライアント」となる。サーバーは複数のクライアントからの接続を処理できるように設計されることもある。例えば、Windowsのネームドパイプは複数のインスタンスを生成する機能を持つため、一つのネームドパイプ名に対して複数のクライアントが同時に接続し、それぞれ独立した通信路を持つことができる。Unix/LinuxのFIFO(First-In, First-Out、ネームドパイプの一種)は、通常は単一のリーダーと単一のライターの間で利用されることが多いが、適切に設計すれば複数のプロセスが利用することも可能だ。

第三に、データ転送はストリーム指向であり、かつ「同期通信」である。つまり、データを書き込む側は、そのデータが読み出されるまで待機(ブロック)することがある。同様に、データを読み込む側は、パイプにデータが書き込まれるまで待機することがある。これにより、データの順序性が保証される。

第四に、実装によっては「双方向通信」も可能である。例えばWindowsのネームドパイプは、作成時に双方向通信を指定できる。これにより、単一のパイプを通じてデータの送受信の両方を行うことができる。Unix/LinuxのFIFOは通常、単方向の通信路として使われることが多いが、必要に応じて二つのFIFO(一つは送信、もう一つは受信)を用意することで擬似的に双方向通信を実現できる。

ネームドパイプの利用は、オペレーティングシステムが提供するAPIを通じて行われる。プロセスはまず、特定の名前でネームドパイプを作成する。次に、作成したパイプをオープンし、読み取りまたは書き込み、あるいはその両方の操作を開始する。データの送受信が完了したら、パイプをクローズし、最終的にパイプファイルを削除する。

ネームドパイプの利点としては、匿名パイプでは通信できない無関係なプロセス間でも通信が可能であること、共有メモリのような複雑な同期メカニズムを自身で実装する必要がないため、比較的容易にプロセス間通信を実現できる点が挙げられる。また、同一ホスト内での通信に限られるが、ソケット通信に比べてオーバーヘッドが少なく、効率的なデータ転送が期待できる場合もある。

一方、欠点としては、通信が同一のコンピュータ内のプロセスに限定され、ネットワークを介した通信には利用できない点がある。また、共有メモリに比べてスループット(単位時間あたりのデータ転送量)が劣る場合があること、そしてパイプ名の衝突や管理の必要性などが挙げられる。さらに、通信が同期的に行われるため、データの書き込み側と読み込み側のタイミングが合わないと、一方のプロセスが待機状態になる可能性があることも考慮する必要がある。

ネームドパイプは、特定の用途において非常に強力なIPC手段であり、例えば、バックグラウンドで動作するサービスと、そのサービスを制御するフロントエンドアプリケーション間の通信や、異なるアプリケーション間で簡単なデータ交換を行う場合などに活用される。システムエンジニアとして、プロセス間通信の選択肢の一つとして、その特性と限界を理解しておくことは非常に重要である。

関連コンテンツ