当你打电话时会发生什么 WaitForSingleObject() 在您创建的句柄上 CreateFile() 或者 _get_osfhandle()?

由于不值得解释的原因我想使用 WaitForSingleObject() 等待我创建的句柄 _get_osfhandle(fd), , 在哪里 fd 来自定期调用 _open(). 。这可能吗?

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

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

另外,如果我使用的话会有所不同吗 CreateFile() 代替 _get_osfhandle() 在 CRT 文件描述符上?

有帮助吗?

解决方案

不要去做。正如你所看到的,它不确定的行为。

该行为被定义

情况下,也以这样的方式能够相对没有用,除非你不喜欢写额外的代码的已定义。它被发信号时在该手柄任何异步I / O操作完成,其不推广到跟踪哪些I / O操作结束。

为什么你想等待一个文件句柄?很明显的意图,当你正在做的东西,甚至没有支持不够好,不能无限期地阻塞重要的。

其他提示

我找到了以下链接。在我看来,共识是不要这样做。

等待文件句柄

当在异步手柄上启动I/O操作时,手柄将进入非信号状态。因此,当在waitforsingleobject或waitformultipleObjects操作的上下文中使用时,当I/O操作完成时,文件句柄将发出信号。但是,Microsoft积极劝阻这项技术。如果存在多个待处理的I/O操作,它不会概括一下;如果完成任何I/O操作,将发出信号。因此,尽管这种技术是可行的,但它不被认为是最佳实践。

在重叠模式下使用ReadDirectoryChangesw。WaitForsingLeoBject可以在重叠结构中等待事件。

如果使用以下更改通知函数,则还可以使用API​​ WaitforsingLeoBject()等待文件更改:
查找第一个更改通知()
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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top