C 在不使用缓冲区的情况下流式传输 : Copy data from one stream to another directly,

标签 c linux stream posix

我想将数据从一个流复制到另一个流。现在通常,我会这样做:

n = fread(buffer, 1, bufsize, fin);
fwrite(buffer, 1, n, fout);

有没有一种方法可以将数据直接从 fin 写入 fout,而不需要经过缓冲区,即代替 fin->buffer->fout ,我想直接做fin->fout(没有缓冲)。

在 ANSI C 中可以这样做吗?如果没有,是否可以使用 POSIX 函数来实现?还是特定于 Linux 的解决方案?

最佳答案

2 个可能的仅限 Linux 的解决方案是 splice()sendfile() .他们所做的是在不离开内核空间的情况下复制数据,从而实现潜在的显着性能优化。

请注意两者都有限制:

  • sendfile() 2.6.33之前的Linux内核需要socket输出,之后可以输出任何文件,而且要求输入支持mmap()操作,也就是说输入不能是 stdin 或管道。

  • splice()要求输入或输出流之一是管道(不确定两者),并且对于内核版本 2.6.30.10 和更早版本,它要求不是管道的流的文件系统支持拼接。

编辑:注意 some filesystems might not support splicing for Linux 2.6.30.10 and below .

关于C 在不使用缓冲区的情况下流式传输 : Copy data from one stream to another directly,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21014880/

相关文章:

c++ - 在 64 位 Linux 操作系统上编译 32 位程序导致 fatal error

linux - 如何在 VM 中查找主机的凭据?

c++ - 是否可以使用 NPAPI 函数捕获 flash 播放器的媒体流 URL?

c - printf "__be32"值类型

c - 具有多个语句的三元运算符

android - 如何找到两点之间的相对方位?

c++ - 将 fstream 作为参数传递

c - 传递给 main() 的参数名称是否重要

linux 网络驱动程序 --- net_device_ops

ios - 将二进制信息保存到文件