2010-11-02 51 views
0

我正在使用open/close/etc在unix下执行异步文件I/O。我有一切工作正常,我能够启动后台读取和写入,并等待他们完成使用选择。在Unix下的异步文件IO并找出剩下多少字节

但我还有一个问题。我想知道有多少数据要读/写。
现在,我认为这是一个简单的ioctl调用,但我可以找到整个事情:(

任何人谁可以帮助将非常感谢!

回答

2

如果你正在做的很少有用的文档从一个标准的读取文件,可以使用lseek使用SEEK_CUR和偏移量为0的值来获取当前文件位置,然后lseek结束以获取文件位置的结尾并将其减去。

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

1

你不能可靠地告诉。

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

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

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

1

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

此外,

S_ISFIFO(st.st_mode) 

会告诉你,如果打开流是管道与否,其中ST是一个结构统计。所有unix口味都是如此。

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”将导致更全面的工作示例:)