Linux> 2.6.33:可以使用sendfile()来实现更快的“猫”?

不得不将大量的大文件连接成更大的文件,我们现在使用

  cat file1 file2 ... output_file 

但是想知道能否比那个老朋友做得更快。

读取sendfile()的手册页,可以指定一个到* input_file *的偏移量,从那里发送剩余部分到* output_file *。 但是:我也可以指定* output_file *的偏移量吗? 或者,我可以简单地遍历所有的input文件,只要保持打开我的输出FD和sendfile()'重复进入它,有效地连接* input_files *? 换句话说:如果我不closures它,或者在其中seek(),文件指针是否会保留在结尾?

有谁知道使用sendfile()这样的cat实现吗?


无可否认,我是pipe理员,而不是程序员,所以请忍受我缺乏“真正的”编码知识。

Solutions Collecting From Web of "Linux> 2.6.33:可以使用sendfile()来实现更快的“猫”?"

是的,输出fd的文件指针将保留在其末尾(如果文件是新的或不大于您已经写入的数据)。

sendfile()的文档明确提到(强调我的):

在2.6.33之前的Linux内核中, out_fd必须引用一个套接字。 由于Linux 2.6.33可以是任何文件。 如果它是一个常规的文件,那么sendfile()会适当地改变文件的偏移量

我个人从来没有看到依赖于sendfile()cat的实现,也许是因为2.6.33是相当新的, out_fd不能是fileno(stdout)之前。 sendfile()也是不可移植的,所以这样做会导致只能在Linux 2.6.33 +上运行的cat版本(尽管我猜它仍然可以作为在编译时激活的依赖于平台的优化来实现)。