POSIX стандартизует лишь вспомогательную блокировку. Обязательная блокировка доступна на GNU/Linux, а также в ряде коммерческих систем Unix, но детали варьируют. Далее в данном разделе мы рассмотрим детали для GNU/Linux.
14.2.2. Блокировка POSIX:
fcntl()lockf()Системный вызов
fcntl()fcntl()fcntl()#include <unistd.h> /* POSIX */#include <fcntl.h>int fcntl(int fd, int cmd); /* Not relevant for file locking */int fcntl(int fd, int cmd, long arg); /* Not relevant for file locking */int fcntl(int fd, int cmd, struct flock *lock);Аргументы следующие:
fdcmd<fcntl.h>lockstruct flock14.2.2.1. Описание блокировки
Прежде чем рассмотреть осуществление блокировки, давайте исследуем описание блокировки в операционной системе. Это делается при помощи структуры
struct flockstruct lockstruct flock { ... short l_type; /* Тип блокировки: F_RDLCK, F_WRLCK, F_UNLCK */ short l_whence; /* Как интерпретируется l_start: SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* Начальное блокируемое смещение */ off_t l_len; /* Число блокируемых байтов; 0 означает от начала до конца файла */ pid_t l_pid; /* PID блокирующего процесса (только F_GETLK) */ ...};Поле
l_startl_lenl_whencel_startwhencelseek()l_startl_whencestruct employee { /* что угодно */ }; /* Описание сотрудника */struct flock lock; /* Структура блока */.../* Заблокировать структуру для шестого сотрудника */lock.l_whence = SEEK_SET; /* Абсолютное положение */lock.l_start = 5 * sizeof(struct employee); /* Начало 6-й структуры */lock.l_len = sizeof(struct employee); /* Блокировать одну запись */Используя
SEEK_CURSEEK_ENDl_start/* Заблокировать запись последнего сотрудника */lock.l_whence = SEEK_END; /* Относительно EOF */lock.l_start = -1 * sizeof (struct employee); /* Начало последней структуры */lock.l_len = sizeof(struct employee); /* Заблокировать одну запись */Установка
l_lenl_startl_whencelock.l_whence = SEEK_SET; /* Абсолютное положение */lock.l_start = 0; /* Начало файла */lock.l_len = 0; /* До конца файла */Справочная страница fnctl(3) имеет примечание:
POSIX 1003.1-2001 допускает отрицательные значения
l_lenl_start + l_lenl_start - 1EINVAL(Мы заметили, что справочная страница относится к версиям ядер 2.4.x; стоит проверить текущую справочную страницу, если ваша система новее.)
Теперь, когда мы знаем, как описать где блокируется файл, мы можем описать тип блокировки с помощью
l_typeF_RDLCK F_WRLCK F_UNLCK Таким образом, полная спецификация блокировки включает установку в структуре
struct flock