17

当你调用WaitForSingleObject()你用CreateFile()or创建的句柄时会发生什么_get_osfhandle()

由于不值得解释的原因,我想WaitForSingleObject()用来等待我创建的 HANDLE _get_osfhandle(fd),其中fd来自定期调用_open(). 这可能吗?

我已经在实践中尝试过,并且在某些机器上它按预期工作(句柄始终处于信号状态,因为您可以从中读取更多数据),并且在某些机器上WaitForSingleObject()如果您允许它会无限期阻塞。

MSDN 页面WaitForSingleObject()说,它处理的唯一受支持的事情是“更改通知、控制台输入、事件、内存资源通知、互斥体、进程、信号量、线程和可等待计时器”。

此外,如果我使用CreateFile()而不是_get_osfhandle()CRT 文件描述符会有所不同吗?

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-我们/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 回答