当拼接后源文件发生变化时,splice(2)的语义是什么?

时间:2015-08-14 01:18:36

标签: linux linux-kernel splice zero-copy

我试图找出splice(2)的语义(手册页here)。

我们说我在磁盘上有一个常规文件,我想将其当前内容的一部分写入一个管道(实际上是/dev/fuseFUSE_SPLICE_WRITE的系统上{{1} 1}}能力)。我认为这看起来像:

splice(file_fd, &range_start, fuse_fd, NULL, range_size, 0);

手册页说:

  

虽然我们谈到复制,但通常避免使用实际的副本。内核通过将管道缓冲区实现为一组指向内核内存页面的引用计数指针来实现此目的。内核创建"副本"缓冲区中的页面,通过创建指向页面的新指针(用于输出缓冲区),并增加页面的引用计数:仅复制指针,而不复制缓冲区的页面。

这使我担心如果文件内容随后在感兴趣的范围内发生变化会发生什么。管道中的数据是否继续反映文件的先前内容? (如果是的话,如何实施?)

如果设置了SPLICE_F_MOVE,是否有任何改变?我意识到在现代内核上忽略了这个标志,但是我在谈论预期的语义,因为手册页声称它可能会在某一天恢复。

0 个答案:

没有答案