Не использовать флаг O_SYNC удаляет файл, если происходит сбой системы - PullRequest
0 голосов
/ 03 октября 2019

У меня есть приложение, записывающее данные, сгенерированные из источника, в файл на SDCard.

Если файл был создан с использованием флага O_SYNC, я вижу снижение производительности. Я убрал флаг, чтобы избежать этого снижения производительности.

Но пока данные записываются в этот файл и если происходит сбой системы, этого файла больше нет на SDCard. Но если файл создан с помощью O_SYNC, файл присутствует.

Есть ли способ сохранить файл (предотвратить удаление), если система потерпела неудачу без снижения производительности?

1 Ответ

1 голос
/ 06 октября 2019

Вообще говоря, нет, если вы настаиваете на том, чтобы не влиять на производительность.

Для повышения производительности файловой системы данные и метаданные хранятся в буферном кеше в ОЗУ. Данные и метаданные периодически синхронизируются с диском. Когда происходит сбой системы, данные, находящиеся в ОЗУ в это время, очевидно, теряются.

Это имеет два аспекта. Фактические данные файла, которые являются содержимым файла, и метаданные файла, которые представляют файл в файловой системе и способствуют внутренней согласованности файловой системы. Что вы можете сделать, так это синхронизировать данные и / или метаданные с вашей собственной периодичностью. Скажем, каждый большой блок данных, который вы пишете. Таким образом, вы можете потерять только последнюю часть данных файла, но большая часть файла будет там.

Пожалуйста, посмотрите на fsync(2), fdatasync(2), sync(2), fsync(2),и посмотрите, можете ли вы использовать одну или несколько из этих (или аналогичных) функций в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...