Редактировать команду? [дубликат]

переименование ожидается атомарным: оно либо завершается полностью, либо не завершается вообще. Переименование A на место B должно оставить вас либо с нетронутыми A и B (этого не произошло вообще), либо только с содержимым A под именем B (это завершилось полностью).

Пока система не падает, это будет происходить независимо от вызовов fsync (и т.д.).

Если система все же упала, может оказаться, что само переименование попало на диск (и таким образом завершилось). Помните, что имена != файлы. Файлы/узлы могут иметь несколько имен. Переименование изменяет имена, а не основной файл/данные.

Таким образом, вы можете получить состояние, когда ваша программа написала файл A, переименовала его, чтобы заменить B, а затем отключилось питание. Оказывается, файловая система записала переименование на диск, но не фактические данные в A. Этого не требуется без fsync. Таким образом, вы получаете B нулевой длины или B с нулевым заполнением.

Причина, по которой приложение делает write-temp-file + rename вместо простой перезаписи файла, заключается в том, что оно хочет обеспечить безопасность при сбоях. Пользователь не будет слишком сердиться, если наполовину записанная временная копия его важного документа останется лежать рядом с немодифицированной хорошей копией. Но если хороших копий не останется, пользователь будет недоволен.

27
06.01.2013, 23:12
1 ответ

вы также можете добавить в.bashrc

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

у меня работает.

1
20.08.2021, 12:47

Теги

Похожие вопросы