从linux中不同偏移量的文件中读取

时间:2011-11-03 08:38:32

标签: linux filesystems posix

是否可以在一次系统调用中读取不同偏移量的文件(中间有搜索),如窗口重叠IO?

3 个答案:

答案 0 :(得分:2)

您不能在单个系统调用中执行此操作,但您可以在不使用pread(2)系统调用的情况下执行此操作。此系统调用从文件的起始处开始偏移,从中读取数据的位置。这允许您从文件描述符读取而不改变当前偏移量。 lseek(2)将更改当前的偏移量。

*我在区分磁盘搜索和操作系统搜索。读取文件中的连续块可能会也可能不会导致磁盘搜索。 OS搜索正在改变文件的当前偏移量以用于下一个读/写位置。

答案 1 :(得分:1)

你的问题没有意义。 Windows重叠I / O只是一种用于读取(在本例中)文件的异步方法。它允许您的线程在等待I / O完成时执行其他操作。

无法使用它来读取文件的多个部分,而无需在一次通话中进行干预。

可以使用它来同时进行并发访问,但你必须每次指定你想要的文件段(换句话说,隐式搜索),但你必须这是多个调用,每个段一个。

如果您想在Linux下进行异步I / O,那么DeveloperWorks上有一篇关于aio内容here的有趣文章,可从内核版本2.6开始提供。

请记住,异步I / O(即使在Windows下)可能不会为像本地硬盘这样的快速“设备”带来太多好处。编写该用例可能不值得付出额外的努力。它本身就是网络存储或套接字通信等相对较慢的设备,你可以在I / O完成之前完成相当多的工作。

答案 2 :(得分:1)

readvwritev系统调用是“分散读取”和“收集写入”调用,如果我理解您的问题,请执行您想要的操作。手册页很短但应该足够了。

编辑:我误解了这个问题,正如评论中指出的那样。所要求的内容更像是preadv,它(以及它的并行pwritev)是在Linux 2.6.30中引入的,并在http://lwn.net/Articles/164887/

中进行了描述

进一步修改:我之前认为iovec扩展程序已将其转换为preadv / pwritev,但他们没有:请参阅http://www.kernel.org/doc/man-pages/online/pages/man2/readv.2.html