名前付きパイプ
通常のシェルで使用する無名のパイプとは異なり、名前付きパイプはファイルシステムを使用する。mkfifo() または mknod() で明示的に作成し、2つのプロセスが名前を指定してそのパイプにアクセスでき、一方のプロセスは読み手としてオープンし、もう一方は書き手としてオープンする。名前付きパイプを作成する mkfifo というコマンドもある。
例えば、名前付きパイプを作成し、そのパイプに入力されたものを gzip で圧縮する場合、次のようにすればよい。
これとは全く独立に、パイプに圧縮すべきデータを送り込むことができる。
名前付きパイプは通常のファイルのように削除できる。
名前付きパイプはアプリケーションからアプリケーションへの情報転送を一時ファイルを作成することなく行える。例えば、gzip の伸長後の出力を次のように名前付きパイプにつなげる。
そして、伸長されたデータを次のように MySQL のテーブルにロードする。
名前付きパイプがなければ、file.gz を伸長したものをいったん一時ファイルに格納しないと、MySQLにロードできない。一時ファイルに書き込むと、入出力がより多く発生して時間がかかり、ハードディスク上の空き領域も必要になる。
PostgreSQLのコマンドライン型フロントエンド psql も名前付きパイプからデータをロードする機能を備えている。
名前付きパイプ(英: named pipe)は、UNIXおよびUnix系の通常のパイプを拡張したもので、プロセス間通信の技法の1つ。その概念は Microsoft Windows にもあるが、意味論は大幅に異なる。通常のパイプは「無名」であり、使用しているプロセスが動作中のみ存在する。名前付きパイプは永続的で、プロセスが消滅しても存在し続けるので、使わなくなったら削除する必要がある。名前付きパイプはファイルのように扱うことができ、プロセス間通信 (IPC) を行うためにプロセスがオープンして使用する。一般にパイプの動作はFIFOだが、名前付きパイプは、ファイルシステム中での種別(通常ファイル、ディレクトリ、デバイスファイル、etc)として「FIFO」と呼ばれている。
Windowsでは、名前付きパイプはクライアントサーバ型通信に基づいて設計されており、通常の読み書き操作以外にソケットのようにも働く。サーバアプリケーションのための明示的な「受動」モードを備えている。Windows 95 では名前付きパイプのクライアントをサポートしている。Windows NT 系OSではクライアントとサーバの両方をサポートしている。
名前付きパイプはファイルのようにアクセスでき、Win32 SDK の CreateFile(オープン)、ReadFile(リード)、WriteFile(ライト)、CloseHandle(クローズ)が使える。Unix系のようなコマンドラインインタフェースは存在しない。
Unix系とは異なり、通常のファイルシステム内に作成することはできない。また永続性もなく、オープンしていたものが全てクローズすると消滅する。全てのパイプは named pipe filesystem (NPFS) のルートディレクトリに置かれ、\\.\pipe\ という特別なパスにマウントされる(つまり、"foo" という名前付きパイプのパス名は "\\.\pipe\foo" となる)。無名パイプも実際にはランダムな名前の名前付きパイプとして実装されている。
Windows上でユーザーが名前付きパイプを目にすることは滅多にないが、例外もある。PC用ハードウェア仮想化ツールであるVMware Workstationでは、ホストシステムのシリアルポートをゲストOSに見せるのに名前付きパイプを使っている。マイクロソフトのカーネルモードデバッガ WinDbg(英語版) はデバッグ操作の通信手段として名前付きパイプをサポートしている。