名前付きパイプの種類、読み取り、待機モード

パイプ サーバーは、CreateNamedPipe 関数の dwPipeMode パラメーターでパイプの種類モード、読み取りモード、および待機モードを指定します。 パイプ クライアントは、 CreateFile 関数を使用して、パイプ ハンドルにこれらのパイプ モードを指定できます。

型モード

パイプの型モードは、名前付きパイプにデータを書き込む方法を決定します。 データは、名前付きパイプを介して、バイトストリームまたはメッセージストリームとして送信できます。 パイプ サーバーは、 CreateNamedPipe を呼び出して名前付きパイプのインスタンスを作成するときにパイプの種類を指定します。 型モードは、パイプのすべてのインスタンスで同じである必要があります。

バイト型パイプを作成するには、PIPE_TYPE_BYTEを指定するか、既定値を使用します。 データはバイトストリームとしてパイプに書き込まれ、システムは異なる書き込み操作で書き込まれたバイトを区別しません。

メッセージタイプのパイプを作成するには、PIPE_TYPE_MESSAGEを指定します。 システムは、各書き込み操作でパイプに書き込まれたバイトをメッセージ単位として扱います。 システムは常に、書き込みモードが有効になっているかのように、メッセージ型パイプに対して書き込み操作を実行します。

読み取りモード

パイプの読み取りモードは、名前付きパイプからデータを読み取る方法を決定します。 パイプ サーバーは、 CreateNamedPipe を呼び出すときにパイプ ハンドルの初期読み取りモードを指定します。 データは、バイト読み取りモードまたはメッセージ読み取りモードで読み取ることができます。 バイト型パイプへのハンドルは、バイト読み取りモードでのみ使用できます。 メッセージ型パイプへのハンドルは、バイト読み取りモードまたはメッセージ読み取りモードのいずれかにできます。 メッセージ型パイプの場合、読み取りモードは、同じパイプ インスタンスに対するサーバー ハンドルとクライアント ハンドルで異なる場合があります。

パイプ ハンドルをバイト読み取りモードで作成するには、PIPE_READMODE_BYTEを指定するか、既定値を使用します。 データは、パイプからバイト ストリームとして読み取られます。 パイプ内のすべての使用可能なバイトが読み取られた場合、または指定したバイト数が読み取られた場合、読み取り操作は正常に完了します。

メッセージ読み取りモードでパイプ ハンドルを作成するには、PIPE_READMODE_MESSAGEを指定します。 データは、メッセージのストリームとしてパイプから読み取られます。 読み取り操作は、メッセージ全体が読み取られた場合にのみ正常に完了します。 読み取るバイト数が次のメッセージのサイズより小さい場合、関数は 0 を返す前にできるだけ多くのメッセージを読み取ります ( GetLastError 関数はERROR_MORE_DATAを返します)。 メッセージの残りの部分は、別の読み取り操作を使用して読み取ることができます。

パイプ クライアントの場合、 CreateFile によって返されるパイプ ハンドルは、最初は常にバイト読み取りモードになります。 パイプ クライアントとパイプ サーバーの両方で 、SetNamedPipeHandleState 関数を使用してパイプ ハンドルの読み取りモードを変更できます。 パイプ ハンドルには、FILE_WRITE_ATTRIBUTESアクセス権が必要です。

待機モード

パイプ ハンドルの待機モードは、 ReadFileWriteFileConnectNamedPipe 関数が長い操作を処理する方法を決定します。 ブロッキング待機モードでは、関数はパイプのもう一方の端にあるプロセスが操作を完了するまで無期限に待機します。 非ブロッキング待機モードでは、関数は、それ以外の場合は無期限の待機を必要とする状況で直ちにを返します。

ReadFile 操作は、パイプが空の場合にパイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルを使用すると、パイプのもう一方の端に書き込むスレッドからデータを使用できるようになるまで、操作は正常に完了しません。 非ブロック待機ハンドルを使用すると、この関数は直ちにゼロを返し、 GetLastError 関数はERROR_NO_DATAを返します。

WriteFile 操作は、パイプのバッファーに十分な領域がない場合に、パイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルでは、パイプのもう一方の端からのスレッド読み取りによってバッファーに十分な領域が作成されるまで、書き込み操作は成功できません。 非ブロック待機ハンドルを使用すると、書き込み操作は、バイトを書き込まずに (メッセージ型パイプの場合)、またはバッファーが保持するバイト数 (バイト型パイプの場合) を書き込んだ後に、直ちに 0 以外の値を返します。

ConnectNamedPipe 操作は、クライアントが接続されていない場合、またはパイプ インスタンスへの接続を待機している場合に、パイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルでは、パイプ クライアントが CreateFile 関数または CallNamedPipe 関数を呼び出してパイプ インスタンスに接続するまで、接続操作は成功しません。 非ブロッキング待機ハンドルを使用すると、接続操作は直ちにゼロを返し、 GetLastError 関数はERROR_PIPE_LISTENINGを返します。

既定では、 CreateNamedPipe または CreateFile 関数によって返されるすべての名前付きパイプ ハンドルは、ブロッキング待機モードを有効にして作成されます。 非ブロック待機モードでパイプを作成するために、パイプ サーバーは CreateNamedPipe を呼び出すときにPIPE_NOWAITを指定します。

パイプ クライアントとパイプ サーバーの両方で、 SetNamedPipeHandleState 関数の呼び出しでPIPE_WAITまたはPIPE_NOWAITを指定することで、パイプ ハンドルの待機モードを変更できます。

Note

非ブロック待機モードは、Microsoft LAN Manager バージョン 2.0 との互換性のためにサポートされています。 このモードは、名前付きパイプを使用して重複する入出力 (I/O) を実現するために使用しないでください。 重複した I/O を代わりに使用する必要があります。これは、関数が戻った後に、時間のかかる操作をバックグラウンドで実行できるためです。 重複する I/O の詳細については、「 同期入力と重複入力と出力」を参照してください。