Есть процесс P1 который пишет в файл F(i), i — номер запуска P1.
То есть P1 периодически просыпается, пишет в F(i) и дохнет.
Все F(i) лежат в одной директории.
Независимо от него существует процесс P2, код для которого пишу я.
P2 запускается через виндовый шедуллер (scheduller), мониторит
директорию с F(i). Если находит новый файл выполняет над ним некие
вычисления и погибает. Проблема: когда P2 нашел новый файл и начал над выполнять
вычисления, как понять что в этот же файл не пишет P1. То есть вообще как понять что
данный процесс – единственный пользователь данного файла. Решение нужно посредством
функций WinAPI. Что нибудь вроде фунцкии (вымышленной )
EnumFileProccesses(HANDLE hfile, DWORD * nextproccessid).
Буду благодарен за любые идеи.
1) открыть эксклюзивнов P2. если не откроется — кто-то его использует (P1?)
2) завести именованный объект синхронизации (для каждого файда) в P1 и использовать его уникальное имя для синхронизации действий в P2 (если P1 тоже Ваш код и Вы его можете менять конечно)
3) покопать в сторону lock/unlock file's data range
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Как определить, что файл никто не использует?
От:
Аноним
Дата:
08.06.03 11:57
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, SergeyLa, Вы писали:
AS>[]
AS>Перебрать все хэндлы файлов и посмотреть их владельцев.
Подскажите, как это сделать.
Re[3]: Как определить, что файл никто не использует?
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, SergeyLa, Вы писали:
SL>Есть процесс P1 который пишет в файл F(i), i — номер запуска P1. SL>То есть P1 периодически просыпается, пишет в F(i) и дохнет. SL>Все F(i) лежат в одной директории. SL>Независимо от него существует процесс P2, код для которого пишу я. SL>P2 запускается через виндовый шедуллер (scheduller), мониторит SL>директорию с F(i). Если находит новый файл выполняет над ним некие SL>вычисления и погибает.
Если есть доступ к коду процесса P1, то почему бы проще не сделать? Процесс P1 просыпается, создает файл tmp_i.p1, пишет в него, закрывает файл, затем переименовывает его в file_i.p1. Второй процесс ищет новые файлы только по маске file_*.p1, отсекая, таким образом, файлы, с которыми еще работает первый процесс. Переименование файла, насколько я понимаю — действие атомарное.
Если P1 создает F(i) без sharing, то можно открыть F(i) в эксклюзивном режиме.
Здравствуйте, SergeyLa, Вы писали:
SL>Есть процесс P1 который пишет в файл F(i), i — номер запуска P1. SL>То есть P1 периодически просыпается, пишет в F(i) и дохнет. SL>Все F(i) лежат в одной директории. SL>Независимо от него существует процесс P2, код для которого пишу я. SL>P2 запускается через виндовый шедуллер (scheduller), мониторит SL>директорию с F(i). Если находит новый файл выполняет над ним некие SL>вычисления и погибает. Проблема: когда P2 нашел новый файл и начал над выполнять SL>вычисления, как понять что в этот же файл не пишет P1. То есть вообще как понять что SL>данный процесс – единственный пользователь данного файла. Решение нужно посредством SL>функций WinAPI. Что нибудь вроде фунцкии (вымышленной ) SL>EnumFileProccesses(HANDLE hfile, DWORD * nextproccessid). SL>Буду благодарен за любые идеи.
Если P1 создает F(i) без sharing, то можно открыть F(i) в эксклюзивном режиме.
Здравствуйте, SergeyLa, Вы писали:
SL>Есть процесс P1 который пишет в файл F(i), i — номер запуска P1. SL>То есть P1 периодически просыпается, пишет в F(i) и дохнет. SL>Все F(i) лежат в одной директории. SL>Независимо от него существует процесс P2, код для которого пишу я. SL>P2 запускается через виндовый шедуллер (scheduller), мониторит SL>директорию с F(i). Если находит новый файл выполняет над ним некие SL>вычисления и погибает. Проблема: когда P2 нашел новый файл и начал над выполнять SL>вычисления, как понять что в этот же файл не пишет P1. То есть вообще как понять что SL>данный процесс – единственный пользователь данного файла. Решение нужно посредством SL>функций WinAPI. Что нибудь вроде фунцкии (вымышленной ) SL>EnumFileProccesses(HANDLE hfile, DWORD * nextproccessid). SL>Буду благодарен за любые идеи.
Самый простой способ, это синхронизация. Пусть Р1 в момент начала работы с файлом оздает Mutex а при окончании работы с оным, релизит этот Mutex, а Р2 проверяет наличие Mutex и ждет его завершения.
Если доступа к коду Р1 нет, то можно энумировать процессы c помощью EnumProcesses и при наличии Р1 ждать его завершения.
С регардами
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....