Как я могу использовать копию при записи BTRFS из кода C ++? - PullRequest
0 голосов
/ 11 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 14 октября 2018

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

...