LINUX.ORG.RU

Атомарное обновление файла

 ,


1

1

Допустим есть процес(ы) который часто (несколько раз в секунду) читает содержимое файла (открыл - прочитал - закрыл). Файл статический но иногда (скажем раз в 1-2 недели) в файле нужно внести какието изменения, при этом не хотелось бы чтоб процесс который читает данные из файла прочел какойто промежуточный вариант (где часть данных уже обновилась, а часть нет). Скажу сразу с локами возится не хочется, и не факт что получится их прикрутить в текущей задаче.

На данном этапе я храню несколько версий файла

data.v1
data.v2
data.v3
+ симлинк
data -> data.v3
И если мне нужно обновить данные, я создаю новую копию data.v4 и когда копия полностью готова то обновляю симлинк data -> data.v4 . Вродебы все работает, но хотелось бы узнать действительно ли такая процедура гарантирует атомарность обновления данных, и нельзя ли обойтись без симлинки (например подготавливаем копию потом делаем mv data.new data с перезаписью - но боюсь что mv с перезаписью это unlink + rename и есть короткий промежуток времени где файла вообще не будет).

★★★★

Последнее исправление: zaz (всего исправлений: 1)

man: If newpath already exists, it will be atomically replaced (subject to a few conditions; see ERRORS below), so that there is no point at which another process attempting to access newpath will find it missing.

Elyas ★★★★★
()

Оставь как есть, всяко ОС не выдаст кривую ссылку в момент обновления. Если сейчас нет претензий к работе тем более.

ilovewindows ★★★★★
()

Стандартый метод:

echo «New data» > myfile.new

mv myfile.new myfile

П.С. Эта операция атомарна по определению. Многие на нее полагаются.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от teod0r

а сразу эхо в myfile не атомарно?

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Спасибо, действительно посмотрел все мапится в один атомарный системный вызов rename, unlink не используется в этом случае.

zaz ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.