Применить или отменить рекомендательную блокировку к открытому файлу
#include <fcntl.h>int flock( int filedes,int operation );
libc
Функция flock() применяет или отменяет рекомендательную блокировку к файлу, связанному с открытым файловым дескриптором, определяемым filedes. Для установки блокировки с помощью этой функции нужно открыть файл с правом доступа только на запись ( O_WRONLY) или на чтение/запись ( O_RDWR).
Блокировка применяется путем установки одного из следующих значений аргумента operation:
LOCK_EX
или LOCK_SH
. Рекомендательные блокировки дают возможность взаимодействующим процессам выполнять согласованные операции над файлами, но не гарантируют согласованность.
Механизм блокировки допускает два типа блокировок: разделяемую и эксклюзивную. В любое время к файлу может быть применено несколько разделяемых блокировок, но нет возможности применить несколько эксклюзивных или разделяемую и эксклюзивную блокировки к одному файлу.
Разделяемая блокировка может быть изменена на эксклюзивную и наоборот с помощью определения соответствующего типа блокировки. Предыдущая блокировка снимается, новая блокировка применяется (вероятно, после того, как остальные процессы получили и сняли блокировку).
Запрос на блокировку уже заблокированного объекта приводит к блокировке вызывающего субъекта до тех пор, пока блокировка не будет получена. Если не планируется, чтобы вызывающий объект блокировался, нужно установить флаг LOCK_NB в функции, чтобы она завершилась с ошибкой ( errno устанавливается в EWOULDBLOCK
).
Блокировки применяются к файлам, а не к файловым дескрипторам. Таким образом, файловые дескрипторы, дублированные с помощью dup() или fork(), не приводят к множественным экземплярам блокировки, а скорее к множественным ссылкам на одну блокировку. Если процесс, удерживающий блокировку файла, дублируется с помощью fork(), и потомок явно разблокирует файл, родительский процесс также теряет блокировку. |
Процессы, заблокированные в ожидании блокировки, могут быть разбужены сигналами.
/dev/shmem
. Unix
Предыдущий раздел: Описание API системной библиотеки