flock()

Применить или отменить рекомендательную блокировку к открытому файлу

Прототип:

#include <fcntl.h>
int flock( int filedes,
int operation );

Аргументы:

filedes
Файловый дескриптор открытого файла.
operation
Что необходимо сделать с файлом.

Библиотека:

libc

Описание:

Функция flock() применяет или отменяет рекомендательную блокировку к файлу, связанному с открытым файловым дескриптором, определяемым filedes. Для установки блокировки с помощью этой функции нужно открыть файл с правом доступа только на запись ( O_WRONLY) или на чтение/запись ( O_RDWR).

Блокировка применяется путем установки одного из следующих значений аргумента operation:

LOCK_EX
Эксклюзивная блокировка.
LOCK_NB
Не блокировать при получении блокировки. Для неблокирующего поведения следует использовать ИЛИ с LOCK_EX или LOCK_SH.
LOCK_SH
Разделяемая блокировка.
LOCK_UN
Разблокировать существующую операцию блокировки.

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

Механизм блокировки допускает два типа блокировок: разделяемую и эксклюзивную. В любое время к файлу может быть применено несколько разделяемых блокировок, но нет возможности применить несколько эксклюзивных или разделяемую и эксклюзивную блокировки к одному файлу.

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

Запрос на блокировку уже заблокированного объекта приводит к блокировке вызывающего субъекта до тех пор, пока блокировка не будет получена. Если не планируется, чтобы вызывающий объект блокировался, нужно установить флаг LOCK_NB в функции, чтобы она завершилась с ошибкой ( errno устанавливается в EWOULDBLOCK).


Note: Блокировки применяются к файлам, а не к файловым дескрипторам. Таким образом, файловые дескрипторы, дублированные с помощью dup() или fork(), не приводят к множественным экземплярам блокировки, а скорее к множественным ссылкам на одну блокировку. Если процесс, удерживающий блокировку файла, дублируется с помощью fork(), и потомок явно разблокирует файл, родительский процесс также теряет блокировку.

Процессы, заблокированные в ожидании блокировки, могут быть разбужены сигналами.

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

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EBADF
Некорректный дескриптор filedes.
EINVAL
Аргумент функции не включает одно из значений LOCK_EX, LOCK_SH или LOCK_UN.
ENOMEM
Система не может выделить достаточное количество памяти для размещения ресурсов блокировки.
EOPNOTSUPP
Аргумент filedes ссылается на объект, не являющийся файлом.
EWOULDBLOCK
Файл заблокирован с установкой LOCK_NB.
ENOSYS
Функция не поддерживается файловой системой /dev/shmem.

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

Unix

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

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

fcntl(), lockf(), open()




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