Как правильно делать lock файла?

Есть два(или более) писателя, которые пишут в файл
Для этого они лочат файл(flock), но проблема заключается в том что они не просто дописывают в него информацию. Для поддержки целостности данных они создают его копию и в копию дописывают нужную информацию, после чего переименовывают новый файл в старый и снимают лок.
Проблема заключается в том что когда второй процесс наконец-то дожидается разблокировки файла он будет писать в старый файл, и получаются потери данных

видел решения в виде для каждого файла создавать файл "file.lock", есть ли более красивые решения. например с временными файлами?
  • Вопрос задан
  • 3617 просмотров
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Просто у Вас сама схема разделения файла неправильная, особенно с переименованием. Так как получается, что это не один файл, а куча файлов с иногда одинаковым именем.
Вообще-то обмен или запись некольких процессов в один файл всегда не есть хорошо!
Лучше взять пример с syslog или подобного сервиса, где ТОЛЬКО ОДИН процесс(сервис) пишет в файл, его переименовывает и как хочет с ним, так и хозяйничает, а все остальные работают с данным процессом через сокеты.
Для облегчения задачи можно использовать очереди типа zeromq или rabbitmq, или какой-то подобный фреймворк.

Если же по каким-то причинам сокеты использовать нельзя, то делать придется таким образом:
1) Пишем во временный файл.
2) Захватываем блокировку на целевой файл и переписываем его содержимое
3) убираем блокировку, удаляем временный файл.
Но, блин, как же все это будет тормозить и глючить при больших объемах!!!

PS. Вообще-то блокировки были придуманы для того, чтобы обеспечить консистентность, когда ОДИН пишет, а ДРУГИЕ читают. Или для того чтобы куча процессов дописывало в конец файла. Захватил-записал-отпустил. Для всего остального в базе ОС есть IPC, пайпы и сокеты (в том числе и файловые-UNIX).

О, вот по-русски классику нашел - citforum.ru/operating_systems/linux_pg/lpg_02.shtml
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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