17

WaitForSingleObject()またはで作成したハンドルを呼び出すとどうなりますCreateFile()_get_osfhandle()?

説明する価値のない理由で、 でWaitForSingleObject()作成した HANDLE を待機するために使用したいと思います。これは可能ですか?_get_osfhandle(fd)fd_open()

実際に試してみたところ、一部のマシンでは期待どおりに動作し (HANDLE からより多くのデータを読み取ることができるため、HANDLE は常にシグナル状態になっています)、一部のマシンでWaitForSingleObject()は許可すると無期限にブロックされます。

MSDN のページにWaitForSingleObject()よると、サポートされているのは、「変更通知、コンソール入力、イベント、メモリ リソース通知、ミューテックス、プロセス、セマフォ、スレッド、および待機可能なタイマー」のみです。

さらに、 CRT ファイル記述子のCreateFile()代わりに使用した場合は異なりますか?_get_osfhandle()

4

2 に答える 2

9

やらないでください。ご覧のとおり、未定義の動作があります。

動作が定義されている場合でも、追加のコードを書くのが嫌いでない限り、比較的役に立たないように定義されています。そのハンドルに対する非同期 I/O 操作が完了すると通知されますが、これは、どの I/O 操作が終了したかを追跡することには一般化されません。

ファイル ハンドルを待機しようとしているのはなぜですか? 無期限にブロックしないほど十分にサポートされていないことを行っている場合は、明らかに意図が重要です。

于 2009-04-21T23:08:59.090 に答える
7

以下のリンクを見つけました。コンセンサスは私には思えます、それをしないでください。

ファイルハンドルを待っています

非同期ハンドルで I/O 操作が開始されると、ハンドルは非シグナル状態になります。したがって、WaitForSingleObject または WaitForMultipleObjects 操作のコンテキストで使用すると、I/O 操作が完了すると、ファイル ハンドルがシグナル状態になります。ただし、Microsoft はこの手法を積極的に推奨していません。保留中の I/O 操作が複数存在する場合は一般化されません。I/O 操作が完了すると、ハンドルがシグナル状態になります。したがって、この手法は実行可能ですが、ベスト プラクティスとは見なされません。

オーバーラップ モードで ReadDirectoryChangesW を使用します。WaitForSingleObject は、OVERLAPPED 構造体でイベントを待機できます。

次の変更通知関数を使用する場合は、API WaitForSingleObject() を使用してファイルの変更を待機することもできます。
FindFirstChangeNotification()
http://msdn.microsoft.com/library/default.asp?url=/library/en- us/fileio/fs/findfirstchangenotification.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp

ReadDirectoryChangesW の「悪意」に関する興味深いメモ:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

于 2009-04-21T23:09:40.150 に答える