2

我试图弄清楚splice(2)(man page here)的语义。

假设我在磁盘上有一个常规文件,我想将其当前内容的一部分写入管道(实际上是/dev/fuse在具有该FUSE_SPLICE_WRITE功能的系统上)。我认为这看起来像:

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

手册页是这样说的:

尽管我们谈论复制,但通常会避免实际复制。内核通过将管道缓冲区实现为一组指向内核内存页面的引用计数指针来实现这一点。内核通过创建引用页面的新指针(用于输出缓冲区)并增加页面的引用计数来在缓冲区中创建页面的“副本”:只复制指针,而不复制缓冲区的页面。

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

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

4

0 回答 0