【问题标题】:WaitForSingleObject on a file handle?WaitForSingleObject 在文件句柄上?
【发布时间】:2010-10-20 23:22:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: windows msvcrt


    【解决方案1】:

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

    即使定义了行为,它也被定义为相对没有用处,除非您不喜欢编写额外的代码。当该句柄上的任何异步 I/O 操作完成时会发出信号,这并不概括为跟踪哪个 I/O 操作完成。

    您为什么要等待文件句柄?显然,当您正在做的事情甚至没有得到足够好的支持而不会无限期阻塞时,意图很重要。

    【讨论】:

    • 操作定义明确。这记录在GetOverlappedResult 下。由于它的实现方式,它可能不受欢迎,并且可能通常没有用。有更好的选择。但是,它的定义很好。
    【解决方案2】:

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

    等待文件句柄

    当一个 I/O 操作在一个 异步句柄,句柄去 进入无信号状态。所以, 当在上下文中使用时 WaitForSingleObject 或 WaitForMultipleObjects 操作, 文件句柄将在 I/O 操作完成。然而, 微软积极劝阻 技术;它没有概括如果 存在多个挂起的 I/O 手术;手柄会变成 如果有任何 I/O 操作,则发出信号 完全的。因此,虽然这 技术可行,不可行 被认为是最佳实践。

    在中使用 ReadDirectoryChangesW 重叠模式。等待单个对象 可以等待中的事件 重叠的结构。

    您也可以使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多