当你用CreateFile()
或_get_osfhandle()
创build的句柄调用WaitForSingleObject()
时会发生什么?
由于不值得解释的原因,我想使用WaitForSingleObject()
来等待我用_get_osfhandle(fd)
创build的HANDLE,其中fd
来自对_open()
的常规调用。 这可能吗?
我已经在实践中尝试过了,在一些机器上它按预期工作(HANDLE总是处于信号状态,因为你可以从中读取更多的数据),而在某些机器上, WaitForSingleObject()
将会无限期地阻塞。
WaitForSingleObject()
的MSDN页面表示它唯一支持的事情是“更改通知,控制台input,事件,内存资源通知,互斥量,进程,信号量,线程和等待定时器”。
另外,如果我在CRT文件描述符上使用CreateFile()
而不是_get_osfhandle()
,会不一样?
不要这样做。 正如你所看到的,它有未定义的行为。
即使行为被定义,它的定义也是相对没有用的,除非你不喜欢编写额外的代码。 当该句柄上的任何异步I / O操作完成时,该信号将被发送,这不会推广到跟踪哪个I / O操作完成。
你为什么试图等待文件句柄? 显然,当你正在做一些甚至没有得到足够支持而不能无限制地阻止的事情时,意图就很重要。
我找到了以下链接。 在我看来,不这样做。
等待文件句柄
当在异步句柄上启动I / O操作时,句柄进入非信号状态。 因此,当在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