Как сохранить смещение файла, чтобы использовать его позже с помощью системных вызовов - PullRequest
0 голосов
/ 04 мая 2019

Я управляю файлами в 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;
}

...