【问题标题】:Win32 select/poll/eof/ANYTHING?Win32 选择/轮询/eof/任何东西?
【发布时间】:2011-02-24 23:11:54
【问题描述】:

使用标准的 Win32 文件 I/O API (CreateFile/ReadFile/etc),我试图等待文件变得可读,或者文件发生异常。如果 Windows 有任何体面的 POSIX 支持,我可以这样做:

select(file_count, files_waiting_for_read, NULL, files_waiting_for_excpt, NULL, NULL);

当某些文件有任何有趣的内容时,select 将返回。 Windows 不支持选择或轮询。美好的。我想我可以拿文件做类似的事情:

while(eof(file_descriptor))
{
    Sleep(100);
}

当有更多数据可供读取时,上述循环将退出。但是不,Windows 也没有等效的 eof() !我可能会在文件上调用 ReadFile() ,并确定它是否处于这种状态。但是,然后我必须在那个时间点处理读取 - 我希望能够简单地找出文件是可读的,而无需实际读取它。

我有什么选择?

【问题讨论】:

    标签: c++ visual-studio winapi mfc


    【解决方案1】:

    Windows 具有完全不同的异步 I/O 架构。您需要使用 overlapped I/O 或不使用相关的 I/O completion ports

    请注意,标准 Winsock 接口确实具有类似 POSIX 的 select() 函数,但仅适用于网络套接字。

    【讨论】:

    • 哇,我讨厌 Windows。一切应该简单的都不是。真的没有'GetEndOfFile'类型的函数吗?我看到有一个 SetEndOfFile :(
    • @Andrew,Windows 不符合 POSIX。
    • 不同并不意味着低劣;显然,对于一个模型,有些事情可能更简单,而另一些则更复杂。你只需要从不同的角度考虑同样的事情。
    • 您可能想查看 GetFileSize: msdn.microsoft.com/en-us/library/aa364955(VS.85).aspx 以查找文件结尾。首先点击搜索“获取文件大小”。
    【解决方案2】:

    无论如何,我在六年后回答:我发现 WSAPoll 类似于 *nix poll。这里链接到 MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms741669(v=vs.85).aspx 我已添加到 Vista 和更高版本中,并且可以与套接字一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多