如何从C ++代码使用BTRFS的写入时复制?

时间:2018-10-11 18:03:11

标签: c++ linux unix btrfs

如何从使用假定支持Linux的Linux系统上的C ++代码在BTRFS文件系统中的文件上使用C ++使用写时复制来复制文件?该解决方案是否适用于所有Unix系统?

在文件系统的C ++标准的任何部分中根本不包含CoW。它在Linux文档中也没有,也不是POSIX标准。

实际上,即使GNU cp实用程序可以处理写入时的复制,由于它需要一个自变量with toupdate as ( select cd.*, ([Debit Amount] - AVG([Debit Amount]) OVER ()) / STDEV([Debit Amount]) OVER () as new_ZScore from ['PCard Output'] cd ) update toupdate set ZScore = new_Zscore; 来强制使用,因此它可能并不总是执行

因此,使用CoW非常可能需要使用低级原语,而这些原语显然没有针对Linux或更广泛的POSIX的文档。

1 个答案:

答案 0 :(得分:1)

您可以看到cp --reflink=always notes.txt notes.txt.backupstrace完成了哪些系统调用。

因此,如果您运行strace cp --reflink=always notes.txt notes.txt.backup,则可以在输出中找到它:

  

openat(AT_FDCWD,“ notes.txt”,O_RDONLY)= 3
  fstat(3,{st_mode = S_IFREG | 0664,st_size = 760,...})= 0
  openat(AT_FDCWD,“ notes.txt.backup”,O_WRONLY | O_TRUNC)= 4
  fstat(4,{st_mode = S_IFREG | 0664,st_size = 0,...})= 0
  ioctl(4,BTRFS_IOC_CLONE或FICLONE,3)= 0

ioctl调用是CoW魔术,可创建文件的显式CoW副本。

您可以阅读man ioctl_ficlone