如何从使用假定支持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的文档。
答案 0 :(得分:1)
您可以看到cp --reflink=always notes.txt notes.txt.backup
和strace
完成了哪些系统调用。
因此,如果您运行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