我想将数据从一个流复制到另一个流。现在通常情况下,我会这样做:
n = fread(buffer, 1, bufsize, fin);
fwrite(buffer, 1, n, fout);
有没有办法直接写入数据fin
to fout
,不经过缓冲区,即代替fin->buffer->fout
,我想直接做fin->fout
(无缓冲区)。
在 ANSI C 中可以这样做吗?如果没有,是否可以使用 POSIX 函数来实现?或者特定于 Linux 的解决方案?
两种可能的仅限 Linux 的解决方案是splice() http://man7.org/linux/man-pages/man2/splice.2.html and 发送文件() http://man7.org/linux/man-pages/man2/sendfile.2.html。他们所做的就是在不离开内核空间的情况下复制数据,从而进行潜在的重大性能优化。
注意两者都有局限性:
发送文件() http://man7.org/linux/man-pages/man2/sendfile.2.html2.6.33之前的Linux内核需要一个套接字来输出,之后任何文件都可以作为输出,并且还需要输入支持mmap()
操作,这意味着输入不能stdin
或管道。
splice() http://man7.org/linux/man-pages/man2/splice.2.html要求输入或输出流之一是管道(不确定两者),并且对于内核版本 2.6.30.10 及更早版本,它要求不是管道的流的文件系统支持拼接。
Edit:注意某些文件系统可能不支持 Linux 2.6.30.10 及更低版本的拼接 https://stackoverflow.com/a/3668131/492336.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)