我想将数据从一个流复制到另一个流。现在通常,我会这样做:
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/