LINUX.ORG.RU
ФорумAdmin

Про пересечения «запись в файл» и «чтение из файла»

 


0

1

На нагруженных системах постоянно ловлю проблемку. Один процесс пишет в файл сигнал каждые N минут, другой процесс вычитывает сигнал из файла каждые M минут. Так вот, при N=M на нагруженных машинах часто ловлю пустоту. Тупо пусто. Ничего.

Классика типа «каждые 5» и «каждые 10» вызывает проблемы, ага. Сейчас лечу с помощью слипа на одной из сторон.

Так вот. Как насчёт «каждые 13 минут» и «каждые 10» минут? Я что-то сходу не соображу как посчитать пересечения. Помогите плиз с математикой.

Спасибо.

ЗЫ. Какой тэг-то поставить...

★★★★★

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

Ты горишь на совместном доступе к общему ресурсу. Поскольку, как я предполагаю, файл у тебя не защищён мьютексами и блокировками, то возникают типовые проблемы. Поэтому товарищ тебе предлагает заменить файл на fifo в качестве решения.

u5er ★★
()

Какую ещё пустоту? Опиши нормально что происходит. Если есть затруднения со словами - покажи пример кода.

Зависимости ситуации от N и M в софте без багов быть, разумеется, не должно. Так же как и костылей с подбором N и M. Осталось найти суть дефекта твоей проги и исправить его.

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

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

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

сисколлы записи и чтения в линуксе атомарные и потокобезопасные

как мне пояснили, атомарное только mv. Они такое делают через временный файл. Пишут во временный файл и потом mv.

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

в конце man 2 read есть ссылка на стандарт posix, где говорится, что фукции read и write должны быть атомарными, и pread, кстати тоже

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

anonymous
()