Как сделать fwrite () согласованным при записи данных в файл - PullRequest
2 голосов
/ 19 мая 2011

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

Иногда данные отсутствуют, иногда они редактируются, а иногда - данные мусора непосредственно передмоя первая запись в файле при перезагрузке системы.

Есть ли способ убедиться, что fwrite соответствует?

Просто чтобы добавить, я использую "a" для добавления данных в файл каждый раз.

Далее, значения мусора или данные indermined, которые я вижу в файле, действительно ли это связано с операцией fwrite ()?

Ответы [ 3 ]

3 голосов
/ 19 мая 2011

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

Чтобы ответить на другой вопрос, нет, мусор не существуетt вообще вызвано fwrite, это потому, что файловая система не завершила операцию записи полностью.

3 голосов
/ 19 мая 2011

Сразу после записи вызовите fflush(3) (для очистки буферов пространства пользователя), а затем либо fsync(2), либо fdatasync(2), чтобы убедиться, что все данные были записаны на устройство.

0 голосов
/ 19 мая 2011

Это зависит от того, какую реализацию FAT использует ваша встроенная ОС.Если вы используете smxFS , то вам следует воспользоваться следующими преимуществами:

The DOS/Windows FAT file system is inherently not power fail safe, so smxFS 
implements features to compensate for this:

   1. sfs_chkdsk() API can check and fix many problems, such as cross-linked 
files, lost chains, bad directory entries, and other problems. Flags specify 
which types of problems to fix (or none). It indicates the results using flags 
in the return value and can give detailed text information in a buffer, to 
allow a human operator to correct problems. Please see the smxFS User’s Guide 
for details.
   2. Clean shutdown checking determines whether all files were closed and 
caches flushed before the system shut down. If not, sfs_chkdsk() should be called.

Если вы ожидаете неожиданные потери мощности, вам следует рассмотреть возможность использования конденсатора или резервного аккумулятора, который позволит вамзакончить запись правильно.Вы, вероятно, захотите sfs_fflush и sfs_fclose (или, может быть, даже sfs_fclose, так как похоже, что он сбрасывает себя)

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

...