名前付きパイプ

名前付きパイプ（）は、UNIXおよびUnix系の通常のパイプを拡張したもので、プロセス間通信の技法の1つ。その概念はMicrosoft Windowsにもあるが、意味論は大幅に異なる。通常のパイプは「無名」であり、使用しているプロセスが動作中のみ存在する。名前付きパイプは永続的で、プロセスが消滅しても存在し続けるので、使わなくなったら削除する必要がある。名前付きパイプはファイルのように扱うことができ、プロセス間通信 (IPC) を行うためにプロセスがオープンして使用する。一般にパイプの動作はFIFOだが、名前付きパイプは、ファイルシステム中での種別（通常ファイル、ディレクトリ、デバイスファイルなど）として「FIFO」と呼ばれている。

 Unix系 
通常のシェルで使用する無名のパイプとは異なり、名前付きパイプはファイルシステムを使用する。mkfifo()mkfifo() または mknod()mknod() で明示的に作成し、2つのプロセスが名前を指定してそのパイプにアクセスでき、一方のプロセスは読み手としてオープンし、もう一方は書き手としてオープンする。名前付きパイプを作成する mkfifo というコマンドもある。

例えば、名前付きパイプを作成し、そのパイプに入力されたものをgzipで圧縮する場合、次のようにすればよい。
 mkfifo my_pipe
 gzip -9 -c < my_pipe > out.gz &
これとは全く独立に、パイプに圧縮すべきデータを送り込むことができる。
 cat file > my_pipe
名前付きパイプは通常のファイルのように削除できる。
 rm my_pipe

名前付きパイプはアプリケーションからアプリケーションへの情報転送を一時ファイルを作成することなく行える。例えば、gzip の伸長後の出力を次のように名前付きパイプにつなげる。

 mkfifo --mode=0666 /tmp/namedPipe
 gzip --stdout -d file.gz > /tmp/namedPipe

そして、伸長されたデータを次のように MySQL のテーブルにロードするMySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax。

 LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;

名前付きパイプがなければ、file.gz を伸長したものをいったん一時ファイルに格納しないと、MySQLにロードできない。一時ファイルに書き込むと、入出力がより多く発生して時間がかかり、ハードディスク上の空き領域も必要になる。

PostgreSQLのコマンドライン型フロントエンド psql も名前付きパイプからデータをロードする機能を備えているhttp://postgresql.1045698.n5.nabble.com/psql-and-named-pipes-td1981226.html。

 Windows 
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 は通常はデバッグ対象コンピュータとシリアルポートで接続するので、WinDbg と VMware Workstation は相互接続可能であり、デバイスドライバのデバッグを単一のコンピュータ上で行うことができる。どちらのプログラムも \\.\pipe\name という形で名前付きパイプの名前をユーザーが入力する必要がある。

Windows NTの名前付きパイプはセキュリティコンテキストを継承できる。

Windows の名前付きパイプについてまとめると次のようになる。
 マシン間およびマシン内のIPC
 全二重または半二重
 バイト単位またはメッセージ単位
 高信頼
 リード/ライトでブロックするか否かを選択可能
 標準デバイスI/Oハンドルを使用 (FileRead, FileWrite)
 専用名前空間を使ってハンドルを作成
 WANトラフィックは効率的でない（TCP/IPなどのようなトラフィック制御は行われない）。
 パイプの入力バッファからデータを取り除かずにリード可能

.NET Framework 3.5で名前付きパイプサポートが追加されたhttps://learn.microsoft.com/en-us/dotnet/api/system.io.pipes?view=net-9.0&redirectedfrom=MSDN。

Microsoft SQL Serverはクライアントとの接続に名前付きパイプも使用できるSQL Server 2005 または SQL Server 2000 の名前付きインスタンスに以前のバージョンの SQL Server のクライアント ツールを使用して接続する方法。

特殊なプロセス間通信 (IPC) 共有に基づき、Server Message Block (SMB) で名前付きパイプをネットワークプロトコルとして使用している。SMBのIPCは、名前付きパイプを通してユーザーの認証コンテキストをシームレスかつ透過的に渡すことができる。Windows NT のNTドメインのプロトコルは、名前付きパイプ上のDCE/RPCサービスとして実装されている。

 関連項目 
 UNIXドメインソケット

 脚注 

 外部リンク 
 The Linux Programmer's Guide: Named Pipes
 mkfifo(1) - Darwin and macOS General Commands Manual 
 Linux Journal: Introduction to Named Pipes 
 MSDN Library: Named Pipes

Category:プロセス間通信