Как я могу использовать копию при записи BTRFS из кода C++?
Как я могу скопировать файл, используя функцию копирования при записи, используя C++, поверх файла в файловой системе BTRFS из кода C++ в системе Linux, которая должна поддерживать его? Является ли решение общим для всех систем Unix?
CoW вообще не включен ни в одну часть стандарта C++ для файловых систем. Он также отсутствует в документации по Linux и не является стандартом POSIX.
На самом деле, даже если утилита GNU cp может обрабатывать копирование при записи, это может выполняться не всегда, так как для этого требуется аргумент, а именно --reflink=true
заставить его использовать
Поэтому использование CoW, скорее всего, потребует использования низкоуровневых примитивов, для которых, очевидно, не было подготовлено никакой документации для Linux или, в более широком смысле, POSIX.
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
call - это волшебство CoW, которое создает явную копию файла CoW.
Ты можешь читать man ioctl_ficlone