名前付きパイプの開きモード

パイプ サーバーは、CreateNamedPipe 関数の dwOpenMode パラメーターでパイプ アクセス、重複、および書き込みモードを指定します。 パイプ クライアントは、 CreateFile 関数を使用して、パイプ ハンドルに対してこれらの開いているモードを指定できます。

アクセス モード

パイプ アクセス モードの設定は、パイプ サーバーのハンドルに関連付けられている読み取りまたは書き込みアクセスを指定することと同じです。 次の表は、 CreateNamedPipe で指定できるアクセス モードごとに同等の汎用アクセス権を示しています。

アクセス モード 同等の汎用アクセス権
PIPE_ACCESS_INBOUND GENERIC_READ
PIPE_ACCESS_OUTBOUND GENERIC_WRITE
PIPE_ACCESS_DUPLEX GENERIC_READ |GENERIC_WRITE

 

パイプ サーバーがPIPE_ACCESS_INBOUNDを使用してパイプを作成する場合、パイプ サーバーのパイプは読み取り専用で、パイプ クライアントの場合は書き込み専用です。 パイプ サーバーが PIPE_ACCESS_OUTBOUND を使用してパイプを作成する場合、パイプ サーバーのパイプは書き込み専用で、パイプ クライアントの場合は読み取り専用です。 PIPE_ACCESS_DUPLEXで作成されたパイプは、パイプ サーバーとパイプ クライアントの両方に対して読み取り/書き込み可能です。

CreateFile を使用して名前付きパイプに接続するパイプ クライアントは、パイプ サーバーで指定されたアクセス モードと互換性のあるアクセス権を dwDesiredAccess パラメーターで指定する必要があります。 たとえば、クライアントは、パイプ サーバーがPIPE_ACCESS_OUTBOUNDで作成したパイプのハンドルを開くGENERIC_READアクセスを指定する必要があります。 アクセス モードは、パイプのすべてのインスタンスで同じである必要があります。

読み取りモードやブロック モードなどのパイプ属性を読み取る場合、パイプ ハンドルはFILE_READ_ATTRIBUTESアクセス権を持っている必要があります。パイプ属性を書き込むには、パイプ ハンドルにFILE_WRITE_ATTRIBUTESアクセス権が必要です。 これらのアクセス権は、パイプに適した汎用アクセス権と組み合わせることができます。読み取り専用パイプのFILE_WRITE_ATTRIBUTES GENERIC_READ、または書き込み専用パイプのFILE_READ_ATTRIBUTESを含むGENERIC_WRITE。 この方法でアクセス権を制限すると、パイプのセキュリティが向上します。

重なり合ったモード

重複モードでは、長い読み取り、書き込み、および接続操作を実行する関数は、すぐに戻ることができます。 これにより、時間のかかる操作がバックグラウンドで実行されている間、スレッドは他の操作を実行できます。 重複モードを指定するには、FILE_FLAG_OVERLAPPED フラグを使用します。 詳細については、「 同期入力と重複入力と出力」を参照してください。

CreateFile 関数を使用すると、パイプ クライアントは dwFlagsAndAttributes パラメーターを使用して、パイプ ハンドルの重複モード (FILE_FLAG_OVERLAPPED) を設定できます。

Write-Through モード

FILE_FLAG_WRITE_THROUGHを使用して書き込みモードを指定します。 このモードは、パイプ クライアントと異なるコンピューター上のパイプ サーバー間のバイト型パイプへの書き込み操作にのみ影響します。 ライトスルー モードでは、名前付きパイプに書き込む関数は、データがネットワーク経由でリモート コンピューター上のパイプのバッファーに送信されるまで返されません。 書き込みモードは、すべての書き込み操作に同期を必要とするアプリケーションに役立ちます。

書き込みスルー モードが有効になっていない場合、最小バイト数が累積されるまで、または最大期間が経過するまでデータをバッファリングすることで、システムはネットワーク操作の効率を向上させます。 バッファリングにより、システムは複数の書き込み操作を 1 つのネットワーク転送に結合できます。 つまり、書き込み操作は、システムが送信バッファーにデータを格納した後、システムがネットワーク経由で送信する前に正常に完了できることを意味します。

CreateFile 関数を使用すると、パイプ クライアントは dwFlagsAndAttributes パラメーターを使用して、パイプ ハンドルの書き込みスルー モード (FILE_FLAG_WRITE_THROUGH) を設定できます。 パイプ ハンドルの作成後、パイプ ハンドルの書き込みモードを変更することはできません。 書き込みモードは、同じパイプ インスタンスに対するサーバー ハンドルとクライアント ハンドルで異なる場合があります。

パイプ クライアントは 、SetNamedPipeHandleState 関数を使用して、書き込みモードが無効になっているパイプの送信前のバイト数とタイムアウト期間を制御できます。 読み取り専用パイプの場合、パイプ ハンドルをGENERIC_READとFILE_WRITE_ATTRIBUTESアクセス権で開く必要があります。