Возвращается тип аренды, существующей в настоящий момент для файла (
F_RDLCK
,
F_WRLCK
или
F_UNLCK
).
Когда в арендованном файле происходит одно из контролируемых событий, ядро передает сигнал удерживающему аренду процессу. По умолчанию передается
SIGIO
, но процесс может выбрать, какой сигнал передавать этому файлу, с помощью вызова
fcntl
, в котором второй параметр установлен в
F_SETSIG
, а последний — в сигнал, который должен использоваться вместо
SIGIO
.
Использование
F_SETSIG
дает один значительный
эффект. По умолчанию
siginfo_t
не передается обработчику при доставке
SIGIO
. Если используется
F_SETSIG
, даже когда сигналом, передаваемым в ядро, является
SIGIO
, a
SA_SIGINFO
был установлен при регистрации обработчика сигнала, файловый дескриптор, аренда которого инициировала событие, передается в обработчик сигналов одновременно с элементом
siginfo_t
по имени
si_fd
. Это позволяет применять отдельный сигнал к аренде множества файлов, в то время как
si_fd
сообщает сигналу, какому файлу необходимо уделить внимание [96] .
96
Если один сигнал используется для аренды множества файлов, убедитесь, что сигнал является сигналом реального времени, так что множество событий аренды ставятся в очередь. Если используется обычный сигнал, он может потеряться либо события аренды могут возникать через очень короткие промежутки времени.
Единственные два системных вызова, которые могут инициировать передачу сигнала для арендуемого файла — это
open
и
truncate
. Когда они вызываются процессом для арендуемого файла, они блокируются [97] , и процессу-владельцу передается сигнал,
open
или
truncate
завершаются после удаления аренды с файла (или его закрытия процессом-владельцем, что вызывает удаление аренды). Если процесс, удерживающий аренду, не отменяет снятие в течение времени, указанного в файле
/proc/sys/fs/lease-break-time
, ядро прерывает аренду и позволяет завершиться запускающему системному вызову.
97
До тех пор пока
O_NONBLOCK
не будет определен как флаг
open
; в этом случае возвращается
EWOULDBLOCK
.
Ниже приведен пример применения владений файлами для уведомления о намерении другого процесса получить доступ к файлу. Список файлов берется командной строки, и на каждый файл помещается аренда записи. Когда другой процесс намеревается получить доступ к файлу (даже для чтения, поскольку использовалась блокировка записи), программа освобождает блокировку файла, позволяя другому процессу продолжать работу. Она также выводит сообщение о том, какой именно файл был освобожден.