【问题标题】:Linux >2.6.33: could sendfile() be used to implement a faster 'cat'?Linux >2.6.33:sendfile() 可以用来实现更快的“猫”吗?
【发布时间】:2013-03-24 02:14:15
【问题描述】:

必须将大量大文件连接成一个更大的文件,我们目前使用

cat file1 file2 ... output_file
但想知道是否可以比与那个老朋友更快地完成。

阅读sendfile() 的手册页,可以指定*input_file* 的偏移量,从哪里将剩余部分发送到*output_file*。但是:我还可以指定 *output_file* 的偏移量吗? 或者我可以简单地循环遍历所有输入文件,只需打开我的输出 FD 并将 sendfile()'ing 反复放入其中,有效地连接 *input_files*? 换句话说:如果我不关闭它也不在其中寻找(),指向我的输出 FD 的文件指针是否会保留在其末尾?

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


诚然,我是管理员,而不是程序员,所以请原谅我缺乏“真正的”编码知识...

【问题讨论】:

    标签: linux cat sendfile


    【解决方案1】:

    是的,输出 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 版本(尽管我猜它仍然可以作为在编译时激活的平台相关优化来实现)。

    【讨论】:

    • ...您似乎比我有另一个“man sendfile”!但是感谢您的解释-这很有帮助。是的,基于 sendfile 的 cat 不能移植,也不适用于较旧的内核修订版,但如果它比我们现在拥有的更快,我当然很乐意接受这些限制!
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2018-06-10
    相关资源
    最近更新 更多