Unix下的异步文件IO,并找出剩余的字节数

时间:2010-11-02 18:05:55

标签: c++ c unix file-io asynchronous

我在unix下使用open / close / etc进行异步文件I / O.我一切正常,我能够启动后台读写,并等待他们完成选择。

然而,我还有一个问题。我想知道有多少数据可供读/写 现在我假设这是一个简单的ioctl调用,但我可以找到很少有用的文档:(

任何可以提供帮助的人都会非常感激!

4 个答案:

答案 0 :(得分:2)

如果您正在从标准文件进行读取,则可以使用lseek使用SEEK_CUR并使用值0作为偏移量来获取当前文件位置,然后lseek到结尾以获取文件结束位置并减去它们

不确定如何知道要写多少数据,因为你是写作的人。这取决于你自己的代码。

答案 1 :(得分:1)

你无法可靠地说出来。

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

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

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

答案 2 :(得分:1)

如果是Solaris,则fstat将返回管道中的字节数。其他unix没有。

另外,

S_ISFIFO(st.st_mode) 

会告诉您开放流是否是管道,其中st是结构统计信息。所有unix口味都是如此。

答案 3 :(得分:1)

您可以使用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”将导致更完整的示例:)