Как (F) синхронизировать каталог под Linux в C - PullRequest
0 голосов
/ 29 июня 2018

У меня есть приложение c под Linux. Я переименовываю некоторые файлы с rename(...) Как я могу гарантировать, что переименование будет записано на нижележащий диск?

С файлом я могу сделать что-то вроде:

FILE * f = fopen("foo","w");
...
fflush(f);
fsync(fileno(f));
fclose(f);

Как я могу fsync (или аналогичный) каталог после rename() в c?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

rename() является атомарным (в Linux), поэтому я не думаю, что вам нужно беспокоиться об этом

атомарность обычно гарантируется в операциях, связанных с обработкой имени файла; например, для переименования «спецификация требует, чтобы действие функции было атомарным», то есть при переименовании файла из старого имени в новое, ни при каких обстоятельствах вы никогда не должны видеть эти два файла одновременно.

сбой питания в середине операции rename () не должен оставлять файловую систему в «странном» состоянии, так как имя файла недоступно, поскольку его метаданные повреждены. (т. е. либо операция потеряна, либо операция зафиксирована.)

Источник

Итак, я думаю, вам следует беспокоиться только об ошибке.


Если вы действительно хотите быть в безопасности, fsync() также сбрасывает метаданные (в linux), чтобы вы могли fsync каталог и файл, который вы хотите убедиться, что они присутствуют на диске .

0 голосов
/ 29 июня 2018

Согласно руководству , при возврате функции rename выполнено эффективно (возврат 0) или произошла ошибка (возврат -1), и errno настроено для проверки того, что неправильно.

Если вы хотите, чтобы система применила потенциальные ожидающие изменения только к этому файлу после rename, вы можете сделать:

int fd = open(new_name, O_RDONLY);
syncfs(fd);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...