当您使用WaitForSingleObject()
或CreateFile()
创建的句柄上调用_get_osfhandle()
时会发生什么?
由于不值得解释的原因,我想使用WaitForSingleObject()
等待我使用_get_osfhandle(fd)
创建的HANDLE,其中fd
来自对{{1}的常规调用}}。这可能吗?
我在实践中尝试了它,并且在某些机器上它按预期工作(HANDLE始终处于信号状态,因为您可以从中读取更多数据),并且在某些机器_open()
将无限期地阻止你放了。
WaitForSingleObject()
的MSDN页面表示它处理的唯一受支持的内容是“更改通知,控制台输入,事件,内存资源通知,互斥锁,进程,信号量,线程和可等待的计时器”。
此外,如果我在CRT文件描述符上使用WaitForSingleObject()
而不是CreateFile()
会有所不同吗?
答案 0 :(得分:7)
不要这样做。如您所见,它具有未定义的行为。
即使定义了行为,它的定义也是相对无用的,除非你不喜欢编写额外的代码。当该句柄上的任何异步I / O操作完成时,它会发出信号,这不会概括为跟踪哪个I / O操作完成。
你为什么要等待文件句柄?很明显,当你做的事情甚至没有得到足够的支持以至于无法无限制地阻止时,意图就很重要。
答案 1 :(得分:7)
我找到了以下链接。在我看来,这种共识并没有这样做。
等待文件句柄
在a上启动I / O操作时 异步句柄,句柄去 进入无信号状态。因此, 当在a的上下文中使用时 WaitForSingleObject或 WaitForMultipleObjects操作, 文件句柄将在何时发出信号 I / O操作完成。然而, 微软积极劝阻这一点 技术;它没有概括 存在多个挂起的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