コンピューティングにおいて、名前付きパイプ(その動作からFIFOとも呼ばれる) は、 UnixおよびUnix 系システムにおける従来のパイプ概念の拡張であり、プロセス間通信(IPC) の方法の 1 つです。この概念はOS/2およびMicrosoft Windowsにも見られますが、意味は大きく異なります。従来のパイプは「名前なし」であり、プロセスが存続している間のみ存続します。一方、名前付きパイプは、システムが稼働している限り、プロセスの存続期間を超えて存続します。不要になった場合は削除できます。通常、名前付きパイプはファイルとして表示され、一般にプロセスは IPC のためにそのファイルにアタッチします。
Unixの場合
従来の名前のないシェルパイプラインの代わりに、名前付きパイプラインはファイルシステムを利用します。これはmkfifo()[1]または[2]を使用して明示的に作成され、2つの別々のプロセスが名前でパイプにアクセスできます。1つのプロセスはリーダーとしてパイプを開き、もう1つはライターとしてパイプを開くことができます。
mknod()
たとえば、パイプを作成し、パイプに渡されるものを圧縮するために gzipを設定できます。
mkfifo マイパイプ
gzip -9 -c < my_pipe > out.gz &
別のプロセス シェルでは、独立して、圧縮するデータを送信できます。
cat ファイル > my_pipe
名前付きパイプは、他のファイルと同様に削除できます。
rm my_pipe
名前付きパイプを使用すると、中間の一時ファイルを使用せずに、あるアプリケーションから別のアプリケーションに情報を転送できます。たとえば、次のように gzip の出力を名前付きパイプにパイプできます (上記の例では out.gz ですが、任意の gz を使用できます)。
mkfifo -m 0666 /tmp/namedPipe
gzip -d < out.gz > /tmp/namedPipe
次に、圧縮されていないデータをMySQLテーブル[3]にロードします。
INFILE '/tmp/namedPipe'をTABLE tableNameにロードします。
この名前付きパイプがなければ、MySQL にロードする前に、file.gz の非圧縮バージョン全体を書き出す必要があります。一時ファイルの書き込みには時間がかかり、I/O が増加し、ハード ドライブの空き容量が減少します。
PostgreSQLのコマンドラインユーティリティは、psql名前付きパイプからのデータの読み込みもサポートしています。[4]
Windowsの場合
名前付きパイプは、ファイルとほぼ同じようにアクセスできます。Win32 SDK関数CreateFile、、はそれぞれパイプを開き、読み取り、書き込み、閉じます。Unix とは異なり、PowerShellを除いてコマンド ライン インターフェイスはありません。
ReadFileWriteFileCloseHandle
名前付きパイプは、Unix とは異なり、通常のファイルシステム内でファイルとして作成することはできません。また、Unix の対応するファイルとは異なり、名前付きパイプは揮発性です (最後の参照が閉じられた後に削除されます)。すべてのパイプは、名前付きパイプ ファイルシステム (NPFS) のルート ディレクトリに配置され、特別なパスの下にマウントされます\\.\pipe\(つまり、「foo」という名前のパイプの完全パス名は になります\\.\pipe\foo)。パイプラインで使用される匿名パイプは、実際にはランダムな名前を持つ名前付きパイプです。
ユーザーが目にすることはほとんどありませんが、注目すべき例外もあります。たとえば、VMware Workstation PCハードウェア仮想化ツールは、エミュレートされたシリアル ポートを名前付きパイプとしてホスト システムに公開できます。また、MicrosoftのWinDbgカーネル モードデバッガーは、デバッグ セッションのトランスポートとして名前付きパイプをサポートしています (実際、VMware と WinDbg は結合できます。WinDbg は通常、ターゲット コンピューターへのシリアル接続を必要とするため、ドライバー開発者は1 台のコンピューターで開発とテストを行うことができます)。どちらのプログラムでも、ユーザーはフォームに名前を入力する必要があります。
\\.\pipe\name
Windows NT 名前付きパイプはセキュリティ コンテキストを継承できます。
Microsoft Windows 上の名前付きパイプの概要:
- マシン間およびマシン内 IPC
- 半二重または全二重
- バイト指向またはパケット指向
- 信頼性のある
- コネクション指向通信
- ブロッキングまたは非ブロッキングの読み取りと書き込み(選択可能)
- 標準デバイスI/Oハンドル(
ReadFile、WriteFile) - ハンドルを作成するために使用される名前空間
- 非効率的な WAN トラフィック (TCP/IP スライディング ウィンドウなどとは異なり、明示的なデータ転送要求など)
- ピーク可能な読み取り(パイプの入力バッファから削除せずに読み取る)
.NET Framework 3.5では名前付きパイプのサポートが追加されました。[5]
名前付きパイプはMicrosoft SQL Serverのエンドポイントとしても使用できます。[6]
名前付きパイプは、特別なプロセス間通信(IPC) 共有の使用に基づく、サーバー メッセージ ブロック(SMB) スイートのネットワーク プロトコルでもあります。SMB の IPC は、ユーザーの認証コンテキストを名前付きパイプにシームレスかつ透過的に渡すことができます。Windows NT のNT ドメインプロトコル スイートのサービス全体は、Exchange 5.5 管理アプリケーションと同様に、名前付きパイプ経由の DCE/RPCサービスとして実装されています。
参照
参考文献
- ^ 「mkfifo、mkfifoat - FIFO 特殊ファイルを作成する」。IEEE Std 1003.1-2017。The Open Group。
- ^ 「mknod、mknodat - ディレクトリ、特殊ファイル、または通常ファイルの作成」。IEEE Std 1003.1-2017。The Open Group。
- ^ 「 13.2.7 LOAD DATA ステートメント」。MySQL 8.0 リファレンスマニュアル。MySQL。2020年 6 月 14 日のオリジナルからアーカイブ。2020年 5 月 19 日に取得。
- ^ Aidan Van Dyk (2008-03-27). 「Re: psql and named pipes」. pgsql-hackers . PostgreSQL . 2022-05-20 時点のオリジナルよりアーカイブ。2020-05-19取得。
- ^ 「System.IO.Pipes 名前空間」。Microsoft Developer Network。
- ^ 「以前のバージョンの SQL Server を使用して SQL Server に接続する方法」。Microsoft 2019-11-19。2020-07-20にオリジナルからアーカイブ。2020-05-19に取得。
外部リンク
- Linux プロセス間通信: 名前付きパイプ ( Linux ドキュメンテーション プロジェクト、1996)
- 名前付きパイプ入門 ( Linux Journal、 1997)
