Принудительно удалить блокировки fcntl из другого процесса

Можно ли как-нибудь снять блокировки диапазона байтов fcntl для файла из процесса, который не блокировал эти диапазоны?

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


person Maksim Skurydzin    schedule 26.07.2013    source источник


Ответы (1)


Сразу приходят на ум два варианта.

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

  2. Напишите небольшую библиотеку, которая устанавливает обработчик сигналов реального времени, скажем, SIGRTMAX. Когда этот сигнал перехвачен, отправлен sigqueue(), а полезная нагрузка int описывает дескриптор открытого файла, снимите все блокировки байтов на этом дескрипторе.

    В качестве альтернативы вы можете открыть обработчик сигнала и прочитать файл или канал (скажем, /tmp/PID.lock, где файл или канал содержит пакет данных, определяющий, какой файл или файловый дескриптор и диапазон байтов нужно разблокировать.

    Пока библиотека загружается при запуске процесса (и, возможно, вставляет все вызовы signal() и sigaction(), чтобы убедиться, что ваш сигнал сохраняется в цепочке вызовов), это должно работать нормально.

Второй вариант требует, чтобы вы предварительно загрузили библиотеку (через переменную среды LD_PRELOAD или предварительно загрузили ее для всех двоичных файлов, используя /etc/ld.so.conf).

Промежуточную библиотеку совсем не сложно написать. Я показал пример использования промежуточной библиотеки для отслеживать fork() вызовов. В вашем случае вам нужно будет придумать хороший способ определить диапазоны байтов, которые должны быть разблокированы (в файле или канале, вызванном сигналом), и обработать все это в контексте обработчика сигнала; но для этого существует достаточно низкоуровневых unistd.h функций ввода-вывода, безопасных для асинхронных сигналов.

person Nominal Animal    schedule 26.07.2013