我正在使用open/close/etc在unix下执行异步文件I/O。我有一切工作正常,我能够启动后台读取和写入,并等待他们完成使用选择。在Unix下的异步文件IO并找出剩下多少字节
但我还有一个问题。我想知道有多少数据要读/写。
现在,我认为这是一个简单的ioctl调用,但我可以找到整个事情:(
任何人谁可以帮助将非常感谢!
我正在使用open/close/etc在unix下执行异步文件I/O。我有一切工作正常,我能够启动后台读取和写入,并等待他们完成使用选择。在Unix下的异步文件IO并找出剩下多少字节
但我还有一个问题。我想知道有多少数据要读/写。
现在,我认为这是一个简单的ioctl调用,但我可以找到整个事情:(
任何人谁可以帮助将非常感谢!
如果你正在做的很少有用的文档从一个标准的读取文件,可以使用lseek使用SEEK_CUR和偏移量为0的值来获取当前文件位置,然后lseek结束以获取文件位置的结尾并将其减去。
不确定如何知道剩下多少数据可写,因为你是写它的人,这取决于你自己的代码。
你不能可靠地告诉。
例如,另一个程序可能会将数据添加到您正在阅读的文件的末尾。
“文件”实际上可能是本地或网络管道,根本不是文件。在这种情况下,数据仅在管道关闭时结束。
也就是说,您可以在文件描述符上使用fstat()
找到文件中的字节总数(如果它是文件)。
如果这是Solaris fstat将返回管道中的字节数。其他unixes没有。
此外,
S_ISFIFO(st.st_mode)
会告诉你,如果打开流是管道与否,其中ST是一个结构统计。所有unix口味都是如此。
您可以使用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”将导致更全面的工作示例:)