我试图找出splice(2)
的语义(手册页here)。
我们说我在磁盘上有一个常规文件,我想将其当前内容的一部分写入一个管道(实际上是/dev/fuse
在FUSE_SPLICE_WRITE
的系统上{{1} 1}}能力)。我认为这看起来像:
splice(file_fd, &range_start, fuse_fd, NULL, range_size, 0);
手册页说:
虽然我们谈到复制,但通常避免使用实际的副本。内核通过将管道缓冲区实现为一组指向内核内存页面的引用计数指针来实现此目的。内核创建"副本"缓冲区中的页面,通过创建指向页面的新指针(用于输出缓冲区),并增加页面的引用计数:仅复制指针,而不复制缓冲区的页面。
这使我担心如果文件内容随后在感兴趣的范围内发生变化会发生什么。管道中的数据是否继续反映文件的先前内容? (如果是的话,如何实施?)
如果设置了SPLICE_F_MOVE
,是否有任何改变?我意识到在现代内核上忽略了这个标志,但是我在谈论预期的语义,因为手册页声称它可能会在某一天恢复。