Вам нужно позвонить близко, если вы уже сбросили, чтобы контент пережил неожиданную перезагрузку?

1

Я пишу в файл, и я вызываю flush() после того, как я закончил. Безопасно ли принудительно выйти из программы, скажем, вытащить вилку питания, не вызвав функцию close() в файле? Является вызовом flush(), достаточным для того, чтобы файл не стал поврежденным.

  • 3
    Для вытягивания заглушки вам нужна fsync() , а не просто flush() или close() . Потенциально даже больше, чем это, если это вновь созданный файл и его каталог, возможно, не был синхронизирован с диском.
  • 2
    ... flush() и close() достаточны для того, чтобы другие программы, работающие в системе, могли видеть ваши изменения; их недостаточно для того, чтобы эти изменения пережили нечистое завершение работы ОС. См. Docs.python.org/2/library/os.html#os.fsync.
Показать ещё 6 комментариев
Теги:
file

1 ответ

3
Лучший ответ

Для обеспечения того, чтобы содержимое было сброшено в операционную систему (и доступно для других запущенных приложений), достаточно будет либо flush() либо close() (то есть вам не нужны оба).

Чтобы содержимое было сброшено на диск, вам также необходимо добавить os.fsync() или os.fdatasync(). Обратите внимание, что в случае вновь созданного (или вновь переименованного) файла вам нужно беспокоиться о том, был ли также сброшен каталог.


Кстати, если вы заботитесь о том, чтобы действительно быть уверенными в том, что все добирается до диска, классическая презентация Eat My Data стоит вашего времени и внимания.

  • 0
    Вам нужно использовать функцию os.open (), чтобы использовать os.fsync ()? Я открываю файл прямо сейчас, используя open ().
  • 0
    Файловый объект, созданный с помощью open() имеет функцию fileno() вы можете вызвать, чтобы получить номер FD для передачи в fsync() . Это продемонстрировано в исходной документации, на которую я ссылаюсь.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню