文件句柄上的WaitForSingleObject?

时间:2009-04-21 22:56:58

标签: windows msvcrt

当您使用WaitForSingleObject()CreateFile()创建的句柄上调用_get_osfhandle()时会发生什么?

由于不值得解释的原因,我想使用WaitForSingleObject()等待我使用_get_osfhandle(fd)创建的HANDLE,其中fd来自对{{1}的常规调用}}。这可能吗?

我在实践中尝试了它,并且在某些机器上它按预期工作(HANDLE始终处于信号状态,因为您可以从中读取更多数据),并且在某些机器_open()将无限期地阻止你放了。

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

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

2 个答案:

答案 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