Есть два варианта, которые сразу приходят на ум.
Запишите модуль ядра для этого. Насколько я знаю, на данный момент нет возможности ядра для этого. (Вы можете добавить новую команду fcntl()
, что указанные привилегии суперпользователя или же пользователь, как владелец замка, делают силовое разблокирование или блокировку угона.)
Написать небольшую библиотеку, которая устанавливает сигнал в реальное время обработчик, скажем SIGRTMAX
. Когда этот сигнал пойман, отправляется sigqueue()
, а полезная нагрузка int
описывает открытый файловый дескриптор, освобождает все байтовые блокировки этого дескриптора.
В качестве альтернативы, вы можете иметь обработчик сигнала открыть и прочитать файл или трубу (скажем /tmp/PID.lock
, где файл или труба содержит пакет данных, определяющий, какой файл или файл дескриптора и диапазон байтов для разблокировки.
Как долго как библиотека загружается при запуске процесса (и, возможно, вставляя все signal()
и sigaction()
вызовов убедитесь, что ваш сигнал сохраняется в цепочке вызовов), это должно работать нормально.
Второй вариант требует предварительной загрузки библиотека (через LD_PRELOAD
переменную или предварительно загружать ее для всех двоичных файлов, используя /etc/ld.so.conf
).
Промежуточная библиотека совсем не сложно писать. Я показал пример использования библиотеки-интерполяции для monitor fork()
calls. В вашем случае вам нужно подумать о хорошем способе определения диапазонов байтов, которые нужно разблокировать (в файле или в канале, вызванном сигналом), и обрабатывать все это в контексте обработчика сигнала; но для этого достаточно асинхронных сигнальных низкоуровневых функций ввода-вывода unistd.h
.