2013-07-26 4 views
0

Есть ли способ удалить блокировки диапазона байтов fcntl в файле из процесса, который не сделал заблокировать эти диапазоны?Сильно удалить блокировки fcntl из другого процесса

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

ответ

1

Есть два варианта, которые сразу приходят на ум.

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

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

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

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

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

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