文件句柄上的WaitForSingleObject?

jos*_*hk0 15 windows msvcrt

当您WaitForSingleObject()使用CreateFile()或创建的句柄呼叫时会发生什么_get_osfhandle()

至于原因,不值得说明的是我想用WaitForSingleObject()伺候,我已经与创建句柄_get_osfhandle(fd),其中fd来自一个普通呼叫_open().这可能吗?

我在实践中尝试了它,并且在某些机器上它按预期工作(HANDLE总是处于信号状态,因为你可以从中读取更多数据),并且在某些机器上WaitForSingleObject()如果你允许它将无限期地阻塞.

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

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

MSN*_*MSN 8

不要这样做.如您所见,它具有未定义的行为.

即使定义了行为,它也会以相对无用的方式定义,除非您不喜欢编写其他代码.当该句柄上的任何异步I/O操作完成时,它会发出信号,这不会概括为跟踪哪个I/O操作完成.

你为什么要等待文件句柄?很明显,当你做的事情甚至不能得到足够的支持以至于无法无限制地阻止时,意图就很重要.

  • 操作定义明确.这在[GetOverlappedResult](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx)下记录.由于其实施方式,可能会气馁,并且可能通常不会有用.有更好的选择.但是,它的定义很明确. (3认同)

180*_*ION 7

我找到了以下链接.在我看来,这种共识并不是这样.

等待文件句柄

在异步句柄上启动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