名前付きパイプ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、名前付きパイプ(その動作のためにFIFOとも呼ばれます)は、 UnixおよびUnixライクなシステムでの従来のパイプの概念の拡張であり、プロセス間通信(IPC)の方法の1つです。この概念はOS / 2MicrosoftWindowsにも見られますが、セマンティクスは大幅に異なります。従来のパイプは「名前なし」です"そして、プロセスの間だけ持続します。ただし、名前付きパイプは、システムが稼働している限り、プロセスの存続期間を超えて持続できます。使用されなくなった場合は削除できます。通常、名前付きパイプはファイルとして表示されます。 、および通常、プロセスはIPC用にそれに接続します。

Unixの場合

従来の名前のないシェルパイプラインの代わりに、名前の付いたパイプラインはファイルシステムを利用します。mkfifo()[1]または[2]を使用して明示的に作成されmknod()2つの別々のプロセスが名前でパイプにアクセスできます。1つのプロセスはパイプをリーダーとして開き、もう1つのプロセスはライターとして開くことができます。

たとえば、パイプを作成し、それにパイプされたものを圧縮するように gzipを設定できます。

mkfifo my_pipe
gzip -9 -c <my_pipe> out.gz 

別のプロセスシェルでは、独立して、圧縮するデータを送信できます。

catファイル> my_pipe

名前付きパイプは、他のファイルと同じように削除できます。

rm my_pipe

名前付きパイプを使用すると、中間の一時ファイルを使用せずに、あるアプリケーションから別のアプリケーションに情報を転送できます。たとえば、gzipの出力を次のように名前付きパイプにパイプできます。

mkfifo -m 0666 / tmp / namedPipe
gzip -d <file.gz> / tmp / namedPipe

次に、次のように、圧縮されていないデータをMySQLテーブル[3]にロードします。

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

この名前付きパイプがないと、MySQLにロードする前に、非圧縮バージョンのfile.gz全体を書き出す必要があります。一時ファイルの書き込みには時間がかかり、ハードドライブのI / Oが増えて空き領域が少なくなります。

PostgreSQLのコマンドラインユーティリティはpsql、名前付きパイプからのデータのロードもサポートしています。[4]

Windowsの場合

名前付きパイプには、ファイルのようにアクセスできます。Win32 SDKの関数CreateFile、、、およびパイプを開くReadFile読み取る、書き込む、閉じる。Unixとは異なり、 PowerShellを除いて、コマンドラインインターフェイスはありません。 WriteFileCloseHandle

Unixとは異なり、名前付きパイプは通常のファイルシステム内でファイルとして作成することはできません。また、Unixの対応するものとは異なり、名前付きパイプは揮発性です(それらへの最後の参照が閉じられた後に削除されます)。すべてのパイプは、名前付きパイプファイルシステム(NPFS)のルートディレクトリに配置され、特別なパスの下にマウントされます(つまり、 「 foo\\.\pipe\ 」という名前のパイプのフルパス名は)になります。パイプラインで使用される無名パイプは、実際にはランダムな名前の名前付きパイプです。 \\.\pipe\foo

ユーザーに表示されることはめったにありませんが、注目すべき例外があります。たとえば、VMware Workstation PCハードウェア仮想化ツールは、エミュレートされたシリアルポートを名前付きパイプとしてホストシステムに公開できます。Microsoft WinDbgカーネルモードデバッガーデバッグセッショントランスポートとして名前付きパイプをサポートします(実際、VMwareとWinDbgはWinDbgは通常、ターゲットコンピューターへのシリアル接続を必要とするため、一緒に結合すると、ドライバー開発者は1台のコンピューターで開発とテストを行うことができます。どちらのプログラムでも、ユーザーはフォーム に名前を入力する必要があります。 \\.\pipe\name

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

Microsoft Windowsでの名前付きパイプの概要:

  • マシン間およびマシン内IPC
  • 半二重または全二重
  • バイト指向またはパケット指向
  • 信頼性のある
  • コネクション型通信
  • ブロッキングまたはノンブロッキングの読み取りおよび書き込み(選択可能)
  • 標準デバイスI / Oハンドル(ReadFileWriteFile
  • ハンドルの作成に使用される名前空間
  • 非効率的なWANトラフィック(TCP / IPスライディングウィンドウなどとは異なり、明示的なデータ転送要求)
  • ピーク可能な読み取り(パイプの入力バッファーから削除せずに読み取る)

.NET Framework 3.5には、名前付きパイプのサポートが追加されています。[5]

名前付きパイプは、Microsoft SQLServerのエンドポイントとしても使用できます[6]

名前付きパイプは、特別なプロセス間通信(IPC)共有の使用に基づく、サーバーメッセージブロック(SMB)スイートのネットワークプロトコルでもあります。SMBのIPCは、ユーザーの認証コンテキストを名前付きパイプにシームレスかつ透過的に渡すことができます。Windows NTのNTドメインプロトコルスイート全体は、Exchange 5.5管理アプリケーションと同様に、名前付きパイプを介した DCE / RPCサービスとして実装されます。

も参照してください

参考文献

  1. ^ 「mkfifo、mkfifoat-FIFO特殊ファイルを作成する」IEEE Std1003.1-2017オープングループ
  2. ^ "mknod、mknodat-ディレクトリ、特殊ファイル、または通常のファイルを作成します"IEEE Std1003.1-2017オープングループ。
  3. ^ 「13.2.7LOADDATAステートメント」MySQL8.0リファレンスマニュアルMySQL
  4. ^ Aidan Van Dyk(2008-03-27)。「Re:psqlと名前付きパイプ」pgsql-ハッカーPostgreSQL
  5. ^ 「System.IO.Pipes名前空間」Microsoft DeveloperNetwork
  6. ^ 「以前のバージョンのSQLServerを使用してSQLServerに接続する方法」Microsoft2019-11-19 2020年5月19日取得

外部リンク