Как узнать - пишет ли другой процесс в файл ? (Первый процесс пишет данные в файлы, второй - читает.)

Модератор: Модераторы разделов

svary
Сообщения: 49
ОС: Linux FC-9

Как узнать - пишет ли другой процесс в файл ?

Сообщение svary »

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

Пытаюсь сделать так : второй процесс мониторит общий каталог с помощью dnotify. Ловится событие создания файла. Получив сигнала о создании файла, второй процесс открывает его, обрабатывает и удаляет. Проблема в том, что сигнал ОС посылает в момент СОЗДАНИЯ файла первым процессом. И когда второй процесс пытается его читать. там еще ничего НЕТ !!! Надо каким-то образом дождаться, когда второй процесс завершит создание файла и ЗАКРОЕТ его. Попытка открывать файл на чтение с атрибутом O_EXCL во втором процессе ничего не дает. Первый процесс от меня не зависит никак - я им не управляю. Открывать файл во втором процессе монопольно на запись (если будет ошибка - значит файл захвачен кем-то другим) не хочется по причине сложности получаемого алгоритма действий....
Есть какие-то более простые решения ? Как узнать, что файл открыт на ЗАПИСЬ другим процессом ?
Спасибо сказали:
Аватара пользователя
oxd
Сообщения: 165

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение oxd »

Дык заблокируйте файл. Смотрите в сторону семафоров и мутексов.
Товарищ стой! Сожми покрепче маузер!
Не дай предателю мимо пройти!
Он променял консоль на браузер.
Таким не место в сфере IT!
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение svary »

oxd писал(а):
28.05.2009 10:25
Дык заблокируйте файл. Смотрите в сторону семафоров и мутексов.

Для этого надо ставить и убирать локировки (не важно - семафорами, мьютексами - чем угодно...) в ОБОИХ процессах.
А я делаю только один. И повлиять на поведение процесса-поставщика нет НИКАКОЙ возможности.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение Rootlexx »

Используйте inotify (событие IN_CLOSE_WRITE).
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение rm_ »

Надо каким-то образом дождаться, когда второй процесс завершит создание файла

Простейший вариант:
- закончив запись в файл filename.txt и закрыв его, процесс делает touch filename.txt.ready.
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение svary »

Rootlexx писал(а):
28.05.2009 12:20
Используйте inotify (событие IN_CLOSE_WRITE).

Увы... Есть только dnotyfy, а там только на КАТАЛОГ а не на файл... :-(
Поэтому я и НЕ МОГУ отследить ЗАКРЫТИЕ файла...
Вот и спрашиваю - как-то до системного счетчика открытий файла можно достучаться ?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение Rootlexx »

svary писал(а):
28.05.2009 14:22
Есть только dnotyfy

Уверены?
Ладно, можно поступить так: каждый открытый файл отображается в виде символической ссылки в «/proc/PID_процесса/fd/». Значит, можно перебором найти ссылку на ваш файл, и когда она исчезнет, значит, файл был закрыт.
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение svary »

rm_ писал(а):
28.05.2009 12:28
процесс делает touch filename.txt.ready.

К сожалению, у меня нет ни малейшей возможности повлиять на поведение процесса, пишущего данные в файл. Это встроенная система, операционку для которой и базовый набор ПО ставим не мы. Приходится подлаживаться под существующие реальности...
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение svary »

Rootlexx писал(а):
28.05.2009 14:58
каждый открытый файл отображается в виде символической ссылки в «/proc/PID_процесса/fd/»

Действительно ! Спасибо !
Решение, конечно, тяжелое, но если ничего лучше не найду - сделаю так, как Вы посоветовали !
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение Rootlexx »

svary писал(а):
29.05.2009 06:30
Решение, конечно, тяжелое, но если ничего лучше не найду - сделаю так, как Вы посоветовали !

Если первый процесс пишет в файл постоянно и непрерывно, то можно отслеживать время модификации этого файла раз в некоторый промежуток времени. Как только оно перестаёт изменяться, значит, файл скорее всего был закрыт.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как узнать - пишет ли другой процесс в файл ?

Сообщение drBatty »

svary писал(а):
28.05.2009 10:12
2) Первый процесс собирает данные и пишет их в файл в этом каталоге.
3) Второй процесс - читает записанные файлы, обрабатывает их и уничтожает.
на сколько я понял, никаких блокировок тут нет - просто создаётся жёсткая ссылка. потому от того что процесс №2 уничтожил файл, файл не уничтожается, он уничтожится только после закрытия файла процессом №1, и после его(файла) уничтожения каким-то процессом №3. это возможно сложнее понять, за то чётко и просто работает - если данные кем-то уничтожаются, это не мешает жить другим...
Rootlexx писал(а):
28.05.2009 14:58
каждый открытый файл отображается в виде символической ссылки в «/proc/PID_процесса/fd/»

ага... вот через это и надо.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: