名前付きパイプ操作
パイプ サーバーは、CreateNamedPipe 関数を初めて呼び出す際に、nMaxInstances パラメーターを使用して、同時に存在できるパイプのインスタンスの最大数を指定します。 サーバー CreateNamedPipe を繰り返し呼び出して、インスタンスの最大数を超えない限り、パイプの追加インスタンスを作成できます。 関数が成功した場合、各呼び出しは名前付きパイプ インスタンスのサーバー側にハンドルを返します。
パイプ サーバーがパイプ インスタンスを作成するとすぐに、パイプ クライアントは、CreateFile を呼び出すか、CallNamedPipe関数呼び出して接続できます。 パイプ インスタンスが使用可能な場合、CreateFile は、パイプ インスタンスのクライアント側にハンドルを返します。 パイプのインスタンスが使用できない場合、パイプ クライアントは WaitNamedPipe 関数を使用して、パイプが使用可能になるまで待機できます。
パイプ サーバーは、ConnectNamedPipe 関数を呼び出すことによって、パイプ クライアントがパイプ インスタンスに接続されているタイミングを判断できます。 パイプ ハンドルがブロッキング待機モードの場合、ConnectNamedPipe はクライアントが接続されるまで戻りません。
パイプ クライアントとサーバーは、CallNamedPipeに加えて、名前付きパイプの読み取りと書き込みを行うために、いくつかの関数のいずれかを呼び出すことができます。 これらの関数の動作は、次のように、パイプの種類と、指定したパイプ ハンドルに対して有効なモードによって異なります。
- ReadFile 関数と WriteFile 関数は、バイト型またはメッセージ型のパイプで使用できます。
- ReadFileEx 関数と WriteFileEx 関数は、パイプ ハンドルが重複する操作のために開かれた場合、バイト型またはメッセージ型のパイプで使用できます。
- PeekNamedPipe 関数を使用すると、バイト型パイプまたはメッセージ型パイプの内容を削除せずに読み取ることができます。 PeekNamedPipe は、パイプ インスタンスに関する追加情報を返すこともできます。
- 呼び出し元プロセスへのパイプ ハンドルがメッセージ読み取りモードに設定されている場合は、TransactNamedPipe 関数をメッセージ型の二重パイプと共に使用できます。 この関数は要求メッセージを書き込み、1 回の操作で応答メッセージを読み取り、ネットワーク パフォーマンスを向上させます。
パイプ サーバーは、パイプ クライアントが起動するまでブロック読み取り操作を実行しないでください。 そうしないと、競合状態が発生する可能性があります。 これは通常、C ランタイム ライブラリの初期化コードなど、継承されたハンドルをロックして調べる必要がある場合に発生します。
クライアントとサーバーがパイプ インスタンスの使用を完了すると、サーバーは最初に FlushFileBuffers 関数を呼び出して、パイプに書き込まれたすべてのバイトまたはメッセージがクライアントによって読み取られるようにする必要があります。 FlushFileBuffers は、クライアントがパイプからすべてのデータを読み取るまで戻りません。 その後、サーバーは DisconnectNamedPipe 関数を呼び出して、パイプ クライアントへの接続を閉じます。 この関数は、まだ閉じていない場合に、クライアントのハンドルを無効にします。 パイプ内の未読データは破棄されます。 クライアントが切断されると、サーバーは CloseHandle 関数を呼び出して、パイプ インスタンスへのハンドルを閉じます。 または、サーバーで ConnectNamedPipe を使用して、新しいクライアントがパイプのこのインスタンスに接続できるようにすることもできます。
プロセスは、GetNamedPipeInfo 関数を呼び出すことによって、名前付きパイプに関する情報を取得できます。この関数は、パイプの種類、入力バッファーと出力バッファーのサイズ、作成できるパイプ インスタンスの最大数を返します。 GetNamedPipeHandleState 関数は、パイプ ハンドルの読み取りモードと待機モード、現在のパイプ インスタンス数、およびネットワーク経由で通信するパイプの追加情報を報告します。 SetNamedPipeHandleState 関数は、パイプ ハンドルの読み取りモードと待機モードを設定します。 リモート サーバーと通信するパイプ クライアントの場合、この関数は、収集する最大バイト数、またはメッセージを送信するまでの最大待機時間も制御します (クライアントのハンドルがライトスルー モードが有効な状態で開かれていたと仮定)。