синхронизация межпроцессного чтения/записи

User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

синхронизация межпроцессного чтения/записи

Post by OtherSide »

Ситуация следующая - одна тулза пишет в файл, другая в него читает. Как на C# написать такой код, что бы ждал пока файл закрыт для чтения потому что туда пишут и сразу после освобождения читал? Ну что-то типа waitForSingleObject для тредов на Си, только не для тредов а для файлов и на шарпе? А еще лучше ждал заданное время, а если не дождался кидал экспешн?
User avatar
Medium-rare
Уже с Приветом
Posts: 9239
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: синхронизация межпроцессного чтения/записи

Post by Medium-rare »

Что-то на тему FileSystemWatcher. Когда-то рисовал подобное на C++, но нотификации собственно на изменение файла.
... and even then it's rare that you'll be going there...
User avatar
Medium-rare
Уже с Приветом
Posts: 9239
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: синхронизация межпроцессного чтения/записи

Post by Medium-rare »

partner_ca wrote: 23 May 2017 22:12 Завернуть запись в Мutex.
Чтение ждет на мютексе.
Запись та объект ядра OS? Или mutex с именем для обоих тулзов, чтобы оба могли его использовать? Они, вроде, в разных процессах.
... and even then it's rare that you'll be going there...
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: синхронизация межпроцессного чтения/записи

Post by M. Ridcully »

Хмм, про Винды я уже много чего не помню, но вот практически уверен, что у них есть какой-нить вариант select / epoll.
Ну то есть один процесс (асинхронно) читает, другой пишет. Ничего усложнять или как-то дополнительно "синхронизовать" - это огород городить.
User avatar
Medium-rare
Уже с Приветом
Posts: 9239
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: синхронизация межпроцессного чтения/записи

Post by Medium-rare »

partner_ca wrote: 23 May 2017 22:23
Medium-rare wrote: 23 May 2017 22:14 Запись та объект ядра OS? Или mutex с именем для обоих тулзов, чтобы оба могли его использовать? Они, вроде, в разных процессах.
Имена объектов синхронизации глобальные.
Можно юзать из разных процессов.
Оба тула должны быть напианы тогда самим автором. Ну, конечно, named mutex у них есть, только global. Но мьютекса мало, ещё надо событие. Или надо ждать в цикле try_lock(), что-то такое, не очень. Ну и глобальные события на раз делается.
... and even then it's rare that you'll be going there...
Palych
Уже с Приветом
Posts: 13975
Joined: 16 Jan 2001 10:01

Re: синхронизация межпроцессного чтения/записи

Post by Palych »

А где эти глобальные мутехи хранятся? Shared memory?
User avatar
Medium-rare
Уже с Приветом
Posts: 9239
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: синхронизация межпроцессного чтения/записи

Post by Medium-rare »

Хорошо известная фича Kernel Objects. Принципиально с другими современными OS нет различий, какой-то глобальный хэндл, в данном случае, по имени, и понеслась. Где те объекты хранятся, прикладников волновать не должно.
... and even then it's rare that you'll be going there...
tau
Уже с Приветом
Posts: 510
Joined: 07 Dec 2001 10:01
Location: toronto

Re: синхронизация межпроцессного чтения/записи

Post by tau »

Зависит от того, в каком режиме "тулза" открывает файл на запись. Я бы начал с попытки использовать LockFileEx. Или FileStream.Lock, который, по моим подозрениям, есть то же самое под капотом (но я лично не проверял).
Использование именованных объектов ядра поможет только если "тулза" создаёт таковые при открытия файла на запись, чего можно ожидать только от совершенно параноидальных кодописателей.
Palych
Уже с Приветом
Posts: 13975
Joined: 16 Jan 2001 10:01

Re: синхронизация межпроцессного чтения/записи

Post by Palych »

Я в свое время вместо синхронизации просто переименовывал файлы по окончанию записи.
Операция переименования атомарная (вроде бы) во всех системах.
Пока работает...
shadow7256
Уже с Приветом
Posts: 10589
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: синхронизация межпроцессного чтения/записи

Post by shadow7256 »

del
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: синхронизация межпроцессного чтения/записи

Post by OtherSide »

tau wrote: 24 May 2017 01:57 Зависит от того, в каком режиме "тулза" открывает файл на запись. Я бы начал с попытки использовать LockFileEx. Или FileStream.Lock, который, по моим подозрениям, есть то же самое под капотом (но я лично не проверял).
Использование именованных объектов ядра поможет только если "тулза" создаёт таковые при открытия файла на запись, чего можно ожидать только от совершенно параноидальных кодописателей.
Не, я ничего не пишу, я только читаю. Ну вернее пишу в другом приложении через скрипты, и как там лочится я не знаю, скрипты то к операционке обращаются через чужое приложение
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: синхронизация межпроцессного чтения/записи

Post by OtherSide »

Ну ну если бы оба процесса я писал, то понятно сделать синхронизацию - говно вопрос. Конкретно там что - одно приложение пишет логи - приложение не мое, а второй процесс уже мой их анализирует и рил тайм статистику на сайт фигачет. Оно время от времени эксепшин кидает что файл прочитать нельзя - не смертельно, что юзеру приходится иногда страницу обновить, но как то совсем несолидно.
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: синхронизация межпроцессного чтения/записи

Post by M. Ridcully »

OtherSide wrote: 24 May 2017 18:14 Ну ну если бы оба процесса я писал, то понятно сделать синхронизацию - говно вопрос. Конкретно там что - одно приложение пишет логи - приложение не мое, а второй процесс уже мой их анализирует и рил тайм статистику на сайт фигачет. Оно время от времени эксепшин кидает что файл прочитать нельзя - не смертельно, что юзеру приходится иногда страницу обновить, но как то совсем несолидно.
А, ну тогда я не так задачу понял.
Тогда погуглите аналог inotify на виндах.
Я забыл, как оно называется, но точно есть. Я сам когда-то давно его использовал.
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: синхронизация межпроцессного чтения/записи

Post by M. Ridcully »

Вот первый же ответ: https://stackoverflow.com/questions/351 ... on-windows

Medium-rare вон оказывается давным давно вам написал выше.

Только потом дискуссия к какой-то синхронизации зачем-то сползла...
Pantigalt
Уже с Приветом
Posts: 803
Joined: 24 Jan 2007 07:32
Location: Сергели->Новосибирск->SFBA->Новосибирск->Москва->NY->SFBA

Re: синхронизация межпроцессного чтения/записи

Post by Pantigalt »

OtherSide wrote: 23 May 2017 20:55 Ситуация следующая - одна тулза пишет в файл, другая в него читает. Как на C# написать такой код, что бы ждал пока файл закрыт для чтения потому что туда пишут и сразу после освобождения читал? Ну что-то типа waitForSingleObject для тредов на Си, только не для тредов а для файлов и на шарпе? А еще лучше ждал заданное время, а если не дождался кидал экспешн?
What about this?

You apply filter watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite and on firing event try to read?
Спи быстрее, твоя подушка нужна другому. Copyright Зощенко
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: синхронизация межпроцессного чтения/записи

Post by OtherSide »

M. Ridcully wrote: 24 May 2017 18:32 Вот первый же ответ: https://stackoverflow.com/questions/351 ... on-windows

Medium-rare вон оказывается давным давно вам написал выше.

Только потом дискуссия к какой-то синхронизации зачем-то сползла...
Пропустил, спасибо! Буду изучать

Return to “Вопросы и новости IT”