LINUX.ORG.RU

столкновения при чтении-записи


0

0

помогите разобраться простому юзеру...

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

как вообще и насколько интеллигентно линукс решает задачу конкурентного чтения /записи ?

есть ли простой способ "заблокировать файл", а конкурента поставить в очередь или отразить ?

подскажите хотя бы где можно прочитать или как это называется правильными словами, чтобы можно было в сети поискать...

Анатолий

anonymous

man flock

Или реализуй локи своими силами.

Описание механизма работы с файлами в линухе было в какой-то книжке в разделе документации LORа. Возможно, Programmers Guide.

AngryElf ★★★★★
()

Способы:

1) Блокировать часть файла 2) Блокировать файл 3) Использовать отдельный lock-файл 4) Использовать семафоры SySV

и другие.

Если запись -- раз в несколько секунд, я бы выбрал lock-файл.

Deleted
()
Ответ на: комментарий от Deleted

1, 2 не понял ... блокировать через flock ?

3. - имеется ввиду перед обращением создать файл-метку, а после работы - его убить ? а другая программа просто проверяет наличие файла - метки ? или что-то еще ? если правильно понял - пожалуй так и сделаю, хотя и несколько неизящно.. у меня сейчас все на tcsh сделано, туда это встроится легко, а городить везде flock через С - тоже не сахар

anonymous
()
Ответ на: комментарий от anonymous

> имеется ввиду перед обращением создать файл-метку, а после работы - его убить ? а другая программа просто проверяет наличие файла - метки ?

если это делать "в лоб" то у тебя будет race condition. И рано или поздно система даст сбой. Можно аккуратно сделать через mv -- она атомарная.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

> что двигать через mv лок-файлы..

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

Инициализация лока состоит в создании файла типа my_lock.0 Будем считать что если есть файл my_lock.0 то лок открыт, если есть файл my_lock.1 то он закрыт. Тогда тот кто хочет получить себе лок делает mv my_lock.0 my_lock.1 и смотрит код возврата. Если все ОК то ты взял лок, можешь работать с разделяемым ресурсом, когда хочешь отпустить лок делаешь mv my_lock.1 my_lock.0 Если mv возвращает ошибку, то ты засыпаешь, и пытаешься повторить это еще раз и т.д.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

спасибо! теперь понял эксклюзив могу сделать только, если сохраню лок только с одной стороны (стороны чтения), оно длится дольше...

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

анатолий

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