Есть ли способ узнать, содержит ли текущий процесс определенную блокировку файла? - PullRequest
0 голосов
/ 14 июня 2019

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

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

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

Итак, вопрос: есть ли у потока способ узнать, имеет ли другой поток того же процесса блокировку (LockFile) для данного файла

1 Ответ

0 голосов
/ 14 июня 2019

Я не уверен, есть ли API для запроса, но процесс может запросить себя с помощью функции LockFileEx:

Общая блокировка может перекрывать эксклюзивную блокировку , если обе блокировки были созданы с использованием одного и того же дескриптора файла . Когда общая блокировка перекрывает эксклюзивную блокировку, единственным возможным доступом является чтение владельцем блокировок.

Другой поток может запросить и узнать, может ли он получить общий доступ.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...