代码之家  ›  专栏  ›  技术社区  ›  Goz

Unix下的异步文件IO,找出还有多少字节

  •  0
  • Goz  · 技术社区  · 14 年前

    我正在使用open/close/etc在Unix下执行异步文件I/O。我一切正常,能够启动后台读写,并等待它们使用select完成。

    不过,我还有一个问题。我想知道还有多少数据需要读/写。
    现在我假设这是一个简单的ioctl调用,但是我几乎找不到关于整个过程的有用文档:(

    任何能帮忙的人都会非常感激!

    4 回复  |  直到 14 年前
        1
  •  2
  •   Burton Samograd    14 年前

    如果要从标准文件中读取,可以使用lseek,使用seek cur和偏移量为0的值获取当前文件位置,然后使用lseek到结尾获取文件结尾位置并减去它们。

    不知道您将如何知道还有多少数据要写,因为您是写数据的人。这将取决于您自己的代码。

        2
  •  1
  •   Zan Lynx    14 年前

    你不能可靠地说出来。

    例如,另一个程序可能正在将数据添加到正在读取的文件的末尾。

    “文件”实际上可能是本地或网络管道,而不是文件。在这种情况下,数据只在管道关闭时结束。

    也就是说,您可以在一个文件中找到总字节数(如果 文件)使用 fstat() 在文件描述符上。

        3
  •  1
  •   jim mcnamara    14 年前

    如果这是Solaris,fstat将返回管道中的字节数。其他的统一体则不然。

    也,

    S_ISFIFO(st.st_mode) 
    

    将告诉您开放流是否是管道,其中st是结构stat。这在所有Unix风格上都是正确的。

        4
  •  1
  •   clstrfsck    14 年前

    你可以用 fcntl() 将插座/管道设置为无阻塞。所有电话 read() 然后将读取可用数据,并调用 write() 将尽可能多地写入而不阻塞。在这两种情况下,读/写的数据量都在返回值中。

    没有任何错误检查的示例:

        int flags = fcntl(fd, F_GETFL, 0);
        fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    

    然后在你的 select() 对于所有已通知的句柄,调用如下内容:

        if (buffer_sent < buffer_size)
            buffer_sent += write(socket, buffer+buffer_sent, buffer_size - buffer_sent);
    

    在我勃然大怒之前重申一下:一个完整的解决方案将包括错误检查。

    在谷歌上搜索“非阻塞I/O”将导致更全面的示例:)