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

在linux中以不同的偏移量读取文件,linux,filesystems,posix,Linux,Filesystems,Posix,是否可以在一次系统调用中读取位于不同偏移量的文件(中间没有外寻道),如windows重叠IO?您的问题没有意义。Windows重叠I/O只是一种读取(在本例中)文件的异步方法。它允许线程在等待I/O完成时执行其他操作 在一次调用中,如果不进行搜索,则无法使用它读取文件的多个部分 您可以使用它同时进行并发访问,但每次都必须指定您想要的文件段(换句话说,隐式搜索),但必须以多个调用的方式执行,每个段一个 如果您想要在Linux下进行异步I/O,DeveloperWorks有一篇关于aio的有趣文章,

是否可以在一次系统调用中读取位于不同偏移量的文件(中间没有外寻道),如windows重叠IO?

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

在一次调用中,如果不进行搜索,则无法使用它读取文件的多个部分

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

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


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

您不能在单个系统调用中完成这项工作,但您可以通过使用
pread(2)
系统调用,无需寻找*。此系统调用从读取数据的文件开始处获取偏移量。这允许您在不改变当前偏移量的情况下读取文件描述符<代码>lseek(2)将更改当前偏移量


*我正在区分磁盘搜索和操作系统搜索。读取文件中的连续块可能导致也可能不会导致磁盘寻道。OS seek正在为下一个读/写位置更改文件的当前偏移量。
readv
writev
系统调用是“分散读取”和“聚集写入”调用,如果我理解您的问题,请执行您想要的操作。手册页很短,但应该足够了

编辑:正如评论中指出的,我误解了这个问题。请求的内容看起来更像是
preadv
,它(及其并行
pwritev
)是在Linux 2.6.30中引入的,在


进一步编辑:我以前认为iovec扩展将其制作成了
preadv
/
pwritev
,但它们没有:参见1。请奖励过去帮助过你的人,并接受你以前问题的答案。2.请更详细地解释你想要完成什么。为什么你认为你不能只搜索,读取,再搜索,再读取?我的问题是,多次搜索和读取,即使是连续的偏移量,也会增加太多的时间,减慢IO。所以我认为在一次电话中完成事情会更快,但似乎没有办法。不,没有办法。如果请求已经很快,异步I/O会减慢速度(参见我的最后一段)。如果您正在执行顺序操作,那么您已经获得了预读缓存的好处。另一种可能是
mmap
将文件映射到内存中,让Linux本身担心文件的I/O和分页。我认为这是您正在解决的相反问题。它从文件中读取一个连续块,并将其分散到多个缓冲区。我认为它不允许您访问文件的非连续部分。
preadv
pwritev
系统调用是在Linux 2.6.30中添加的。它们仍然在文件中的一个偏移量处-我一直错误地认为iovec扩展已经用于preadv/pwritev。哦,好吧。