lockf()

Заблокировать или разблокировать секцию в файле

Прототип:

#include <unistd.h>
int lockf( int filedes,
int function,
off_t size );

Аргументы:

fildes
Дескриптор файла, секцию в котором необходимо заблокировать. Файл должен быть открыт с разрешением только на запись ( O_WRONLY) или с разрешением на чтение/запись (( O_RDWR)).
function
Контрольное значение, определяющее действие, которое необходимо предпринять. Допустимые значения (определенные в <unistd.h>) следующие:
F_LOCK
Заблокировать секцию в файле для исключительного использования, если она доступна. Блокировка только для чтения задается одним из следующих значений: O_RDONLY, O_WRONLY, или O_RDWR. Блокировка для исключительного использования задается следующими значениями: O_WRONLY или O_RDWR. (Описание блокировок см. в open()).
F_TEST
Проверить указанную секцию в файле на наличие блокировок, образованных другими процессами.
F_TLOCK
Проверить и заблокировать секцию в файле для исключительного использования, если секция доступна.
F_ULOCK
Снять блокировки с указанной секции файла.
size
Количество смежных байтов, которые необходимо заблокировать или разблокировать. Блокируемая или разблокируемая секция начинается с текущей точки смещения в файле и продолжается вперед для положительного значения size или назад для отрицательного значения size (захватывая предыдущие байты до текущей точки смезения, но не включая её). Если значение size равно 0, блокируется секция от текущей точки смещения до максимально возможного смещения файла (то есть от текущей точки смещения до настоящего или любого будущего конца файла). Не нужно выделять память, чтобы совершить блокировку, поскольку блокировки могут существовать после конца файла.

Библиотека:

libc

Описание:

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

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

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

Блокировки файлов снимаются при первом закрытии процессом блокировки любого файлового дескриптора для файла.

F_ULOCK запросы могут снять блокировку (полностью или частично) с одной или нескольких заблокированных секций, контролируемых процессом. Заблокированные секции разблокируются, начиная с текущей точки смещения файла через size bytes или до конца файла, если size равно (off_t)0. Когда вся заблокированная секция не разблокирована (то есть, когда начало или конец области, которая должна быть разблокирована, попадает в заблокированную секцию), оставшиеся части этой секции все еще блокируются процессом. Разблокирование центральной части заблокированной секции приводит к тому, что, оставшиеся заблокированнми, начальная и конечная части становятся двумя отдельными заблокированными секциями.

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

Взаимодействия между fcntl() и блокировакми lockf() яляются неопределенными. Блокировка секции прерывается любым сигналом.

Если size является максимальным значением типа off_t и у процесса уже есть существующая блокировка размера 0 в этом диапазоне (что указывает на блокировку всего файла), тогда запрос F_ULOCK обрабатывается так же, как и запрос F_ULOCK с размером 0. В противном случае запрос F_ULOCK пытается разблокировать только запрошенную секцию. Попытка заблокировать секцию файла, связанную с буферизованным потоком, дает неопределенные результаты.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno. Существующие блокировки не изменены.

Коды ошибок:

EACCES
EAGAIN
Аргументом функции function является F_TLOCK или F_TEST и секция уже заблокирована другим процессом.
EAGAIN
Аргументом функции function является F_LOCK или F_TLOCK, и файл отображается с помощью mmap().
EBADF
Аргумент fildes не является допустимым дескриптором открытого файла; или функция function имеет аргумент F_LOCK или F_TLOCK и fildes не является допустимым дескриптором файла, открытым для записи.
EDEADLK
Аргументом функции function является F_LOCK, и обнаружена взаимоблокировка.
EINTR
Во время выполнения функции был обнаружен сигнал.
EINVAL
Аргумент функции function не является ничем из перечисленного: F_LOCK, F_TLOCK, F_TEST или F_ULOCK; или size плюс текущая точка смещения файла меньше 0.
ENOMEM
Система не может выделить достаточно памяти для хранения ресурсов блокировки.
EOPNOTSUPP
EINVAL
Данная реализация не поддерживает блокировку файлов типа, указанного в fildes.
EOVERFLOW
Смещение первого байта, или, если size не равен 0, то последнего байта в запрошенной секции не может быть правильно представлен в объекте типа off_t.

Классификация:

POSIX 1003.1 XSI

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

fcntl(), flock(), open()




Предыдущий раздел: Описание API системной библиотеки