Допустим есть процес(ы) который часто (несколько раз в секунду) читает содержимое файла (открыл - прочитал - закрыл). Файл статический но иногда (скажем раз в 1-2 недели) в файле нужно внести какието изменения, при этом не хотелось бы чтоб процесс который читает данные из файла прочел какойто промежуточный вариант (где часть данных уже обновилась, а часть нет). Скажу сразу с локами возится не хочется, и не факт что получится их прикрутить в текущей задаче.
На данном этапе я храню несколько версий файла
data.v1
data.v2
data.v3
+ симлинк
data -> data.v3
И если мне нужно обновить данные, я создаю новую копию data.v4 и когда копия полностью готова то обновляю симлинк data -> data.v4 . Вродебы все работает, но хотелось бы узнать действительно ли такая процедура гарантирует атомарность обновления данных, и нельзя ли обойтись без симлинки (например подготавливаем копию потом делаем mv data.new data с перезаписью - но боюсь что mv с перезаписью это unlink + rename и есть короткий промежуток времени где файла вообще не будет).
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.
Нет. Никто не гарантирует, что записано будет все сразу. Нижележащие слои имеют право разбить данные хоть по одному байтику, и записывать их по штуке в секунду.
Deleted ()
Последнее исправление: Deleted
(всего
исправлений: 1)