2

Windows プラットフォームでサーバー側からクライアント パイプのハンドルの状態を検出する方法があるかどうか疑問に思っています。

クライアントが関数でパイプを閉じた(切断された)にもかかわらず、CloseHandle()サーバー側からそれを検出する方法はないようです。

WaitForSingleObject()ハンドル オブジェクトで使用するとWAIT_OBJECT_0、クライアント ハンドルのステータスに関係なく、 が返されます。では、クライアント パイプのハンドルが閉じているかどうかをサーバー側からより少ないコストで検出するための良い解決策は何でしょうか?

4

1 に答える 1

4

PIPE_ACCESS_INBOUNDパイプ (またはPIPE_ACCESS_DUPLEX)からデータを読み取っているERROR_BROKEN_PIPE場合は、クライアントがパイプの端を閉じたときに取得されます。パイプからのデータを処理する準備ができていない場合でも、パイプがいつ破損したかを検出するために、(非同期 I/O を使用して) 事前に読み取りを開始できます。

パイプのクライアント側に複数のハンドルがある場合、最後のハンドルが閉じられたときにのみ閉じられたと見なされることに注意してください。たとえば、クライアントが誤ってサブプロセスにハンドルのコピーを継承させた場合、これは問題になる可能性があります。

クライアントが送信専用パイプにデータを書き込まずに閉じたことを検出する方法がわかりません。最良のオプションはPIPE_ACCESS_DUPLEX、パイプの受信側がパイプの破損を検出するためだけに使用される場合でも使用することです。

今後の参考として、ハンドルを同期オブジェクトとして使用することはできますが、これはお勧めできません。私が知る限り、サポートされている唯一の使用法は、イベント オブジェクトが指定されていない非同期 I/O 操作の完了を検出することです。

于 2012-06-05T04:01:07.867 に答える