我在unix下使用open / close / etc进行异步文件I / O.我一切正常,我能够启动后台读写,并等待他们完成选择。
然而,我还有一个问题。我想知道有多少数据可供读/写 现在我假设这是一个简单的ioctl调用,但我可以找到很少有用的文档:(
任何可以提供帮助的人都会非常感激!
答案 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”将导致更完整的示例:)