名前付きパイプに書き込みを行なうWin32のクライアント アプリケーションを作成する場合は、名前付きパイプ サーバーによって名前付きパイプが作成される方法を理解しておく必要があります。 これを理解しておくことが、クライアント アプリケーションのCreateFile()システム コールに該当するオプションをコーディングできるようにするために重要です。
Win32 Named Pipes Access Moduleは、名前付きパイプを以下のシステム コールによって作成します。
CreateNamedPipe(PipeName, // Pipe name PIPE_ACCESS_INBOUND, // Open mode PIPE_TYPE_BYTE, // pipe mode 4, // Number of instances BuffSize, // output buffer size BuffSize, // input buffer size 100,// default timeout in milliseconds NULL); // pointer to security attributes
- PipeNameは、\\.\pipe\pipenameの書式の任意の文字列にすることができます。
- pipenameは、クライアント側とサーバー側の両アプリケーションの間で合意されたパイプ名を指定します。
- BuffSizeは、初期化文字列のBlock_sizeパラメータで指定されたバイト数の2倍の値です。
アクセス モジュールではデータをクライアントからサーバーに流すことしかできないため、ユーザーが開発したクライアント アプリケーションは、CreateFile()システム コールでGENERIC_WRITE(GENERIC_READではなく)オプションをコード化する必要があります。
例: Win32の名前付きパイプのAPI
HANDLE hPipe = CreateFile(PipeName,// pipe name GENERIC_WRITE,// write access 0, // no sharing NULL, // no security attributes OPEN_EXISTING, // opens existing pipe 0, // default attributes NULL); // no template file
または、クライアント ユーティリティは、標準の'C'ストリームI/Oを使用して、以下のようにパイプを開くことができます。
FILE *fp = fopen(PipeName, "wb");
アクセス モジュールは、名前付きパイプ サーバーとして、パイプへの接続と同期ブロックI/Oを使用したパイプからの読み取りの両方を行ないます。クライアントは、同期的または非同期的に自由にパイプに書き込むことができます。
アクセス モジュールは、パイプを流れるデータにメッセージ構造を必要としません。 このため、クライアント アプリケーションは、名前付きパイプにバイト ストリームまたはメッセージ ストリームとして書き込むことができます。これは、アクセス モジュールが常にバイト ストリームとしてパイプから読み取りを行なうためです。
Win32名前付きパイプのプログラミングの詳細については、Microsoft Developer Networkライブラリ オンライン (Microsoft開発者ネットワーク オンライン ライブラリ)で、Platform SDK (SDKプラットフォーム)の項目にある"Named Pipes (名前付きパイプ)"の解説を参照してください。