Я управляю файлами в C, используя только системные вызовы, и я создаю метод, назовем его «make_backup», где выполняется резервное копирование файла и его изменение.
Этот файл состоит из двоичных структурных записей, таких как база данных.
Итак, в следующий раз, когда я вызову «make_backup», мне нужно сделать резервную копию там, где последний закончил.
Моя логика заключается в том, чтобы сохранить размер файла при первом вызове «make_backup» и получить доступ к нему во втором вызове. Но проблема, мне запрещено записывать это off_s в другой / тот же файл.
Я пытаюсь сделать отверстие 5 байтов с ftruncate
в конце файла при первом вызове. Во втором вызове используйте lseek с SEEK_HOLE, чтобы найти это смещение + 5 и fallocate w/ FALLOC_FL_COLLAPSE_RANGE
, чтобы удалить это отверстие. Но смещение SEEK_HOLE
всегда равно EOF.
Вторая попытка как-то использовала флаги описания файла, например fcntl(fd, F_SET_FILE_RW_HINT,offset)
, но не повезло.
#define LEN_HOLE 5
int fd = open ("file.bin", O_CREAT | O_RDWR | O_PATH | O_DIRECT, 0777);
off_t size = lseek (fd,0,SEEK_END);
off_t hole = lseek(fd,0,SEEK_HOLE);
ftruncate(fd,size+LEN_HOLE);
if(size==hole) return hole;
fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, hole, LEN_HOLE);
///// or /////
uint64_t hint;
int ret;
ret = fcntl(fd, F_GET_FILE_RW_HINT, &hint);
if (ret < 0) {
perror("fcntl: F_GET_FILE_RW_HINT");
return -1;
}
uint64_t set_hint = (uint64_t) size;
ret = fcntl(fd, F_SET_FILE_RW_HINT, &set_hint);
if (ret < 0) {
perror("fcntl: F_SET_FILE_RW_HINT");
return -1;
}