名前付きパイプ
名前付きパイプ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/02/10 00:34 UTC 版)
名前付きパイプ(英: named pipe)は、UNIXおよびUnix系の通常のパイプを拡張したもので、プロセス間通信の技法の1つ。その概念は Microsoft Windows にもあるが、意味論は大幅に異なる。通常のパイプは「無名」であり、使用しているプロセスが動作中のみ存在する。名前付きパイプは永続的で、プロセスが消滅しても存在し続けるので、使わなくなったら削除する必要がある。名前付きパイプはファイルのように扱うことができ、プロセス間通信 (IPC) を行うためにプロセスがオープンして使用する。一般にパイプの動作はFIFOだが、名前付きパイプは、ファイルシステム中での種別(通常ファイル、ディレクトリ、デバイスファイル、etc)として「FIFO」と呼ばれている。
Unix系
通常のシェルで使用する無名のパイプとは異なり、名前付きパイプはファイルシステムを使用する。mkfifo()
[1] または mknod()
[2] で明示的に作成し、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 のテーブルにロードする[3]。
LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
名前付きパイプがなければ、file.gz を伸長したものをいったん一時ファイルに格納しないと、MySQLにロードできない。一時ファイルに書き込むと、入出力がより多く発生して時間がかかり、ハードディスク上の空き領域も必要になる。
PostgreSQLのコマンドライン型フロントエンド psql
も名前付きパイプからデータをロードする機能を備えている[4]。
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 は通常はデバッグ対象コンピュータとシリアルポートで接続するので、WinDbg と VMware Workstation は相互接続可能であり、デバイスドライバのデバッグを単一のコンピュータ上で行うことができる。どちらのプログラムも \\.\pipe\name という形で名前付きパイプの名前をユーザーが入力する必要がある。
Windows NT の名前付きパイプはセキュリティコンテキストを継承できる。
Microsoft Windows の名前付きパイプについてまとめると次のようになる。
- マシン間およびマシン内のIPC
- 全二重または半二重
- バイト単位またはメッセージ単位
- 高信頼
- リード/ライトでブロックするか否かを選択可能
- 標準デバイスI/Oハンドルを使用 (
FileRead
,FileWrite
) - 専用名前空間を使ってハンドルを作成
- WANトラフィックは効率的でない(TCP/IPなどのようなトラフィック制御は行われない)。
- パイプの入力バッファからデータを取り除かずにリード可能
.NET Framework 3.5 で名前付きパイプサポートが追加された[5]。
Microsoft SQL Server はクライアントとの接続に名前付きパイプも使用できる[6]。
特殊なプロセス間通信 (IPC) 共有に基づき、Server Message Block (SMB) で名前付きパイプをネットワークプロトコルとして使用している。SMBのIPCは、名前付きパイプを通してユーザーの認証コンテキストをシームレスかつ透過的に渡すことができる。Windows NT のNTドメインのプロトコルは、名前付きパイプ上のDCE/RPCサービスとして実装されている。
関連項目
脚注
- ^ mkfifo()
- ^ mknod()
- ^ MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax
- ^ http://postgresql.1045698.n5.nabble.com/psql-and-named-pipes-td1981226.html
- ^ http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx
- ^ SQL Server 2005 または SQL Server 2000 の名前付きインスタンスに以前のバージョンの SQL Server のクライアント ツールを使用して接続する方法
外部リンク
- 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[リンク切れ]
名前付きパイプ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/22 07:35 UTC 版)
「パイプ (コンピュータ)」の記事における「名前付きパイプ」の解説
詳細は「名前付きパイプ」を参照 また、POSIX(UNIX)では、mkfifo() または mknod() を使ってファイルシステムの名前空間に「名前付きパイプ」を作成できる。名前付きパイプは、あたかも入力ファイルまたは出力ファイルであるかのようにオープンでき、そのファイル記述子は、あたかもパイプのファイル記述子であるかのように扱える。これによって、親子関係にない任意のプロセス間でパイプ通信を行うことができる。 シェルからのコマンド操作でも、名前付きパイプの利用は有用である。シェルからは mkfifo コマンドで名前付きパイプを作ることができる。例えば、大規模なファイルツリーのコピーを、cp コマンドの再帰オプション cp -r で行うとうまくない場合がある。tar コマンドでテンポラリファイルに出力すると、ディスク全体のコピーなどでは巨大になり過ぎる。そんな場合に、テンポラリファイルではなく、名前付きパイプを出力先にするのである。通常のパイプでは、展開先に移動して展開するコマンドまで全部続けて書かねばならず、失敗しやすい。名前付きパイプを出力先にして一旦コマンドを実行し、展開先への移動や ls コマンドで状況を確認した後で、おもむろに名前付きパイプを入力元にして tar コマンドで展開すればよい。 Windowsでは、名前付きパイプを作成するサーバ側は、CreateNamedPipe() で「\\.\pipe\パイプ名」という形式の名前で作成すれば、パイプにつなぐクライアント側からファイルの読み書きと同じ操作で読み書きすることができる。また、Windows における匿名パイプは、ランダムな名前の名前付きパイプとして実装されている。 マシン間の通信にも名前付きパイプを利用することができるが、データを送るたびに、通信確認のためのデータが行き来するので、他のマシンと大量のデータを通信するときは、ソケットの方が高速である。ただし、マシン内のプロセス間通信の場合は、Windowsではカーネル内で動作するので名前付きパイプは高速である。
※この「名前付きパイプ」の解説は、「パイプ (コンピュータ)」の解説の一部です。
「名前付きパイプ」を含む「パイプ (コンピュータ)」の記事については、「パイプ (コンピュータ)」の概要を参照ください。
名前付きパイプと同じ種類の言葉
- 名前付きパイプのページへのリンク