Linux — Как я могу использовать копию при записи BTRFS из C ++ кода?

Как я могу скопировать файл, используя копирование при записи, используя C ++, поверх файла в файловой системе BTRFS из кода C ++ в системе Linux, которая, как предполагается, поддерживает это? Является ли решение общим для всех систем Unix?

CoW вообще не включен ни в одну часть стандарта C ++ для файловых систем. Он также отсутствует в документации по Linux и не является стандартом POSIX.

На самом деле, даже если утилита GNU cp может обрабатывать копирование при записи, это может выполняться не всегда, так как для этого требуется аргумент, а именно --reflink=true заставить его использовать

Поэтому использование CoW, скорее всего, потребует использования низкоуровневых примитивов, для которых, очевидно, не было подготовлено никакой документации для Linux или, в более широком смысле, POSIX.

0

Решение

Вы можете увидеть, какие системные вызовы сделаны 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

1

Другие решения

Других решений пока нет …