LOCKF(3C) LOCKF(3C) НАЗВАНИЕ lockf - блокировка сегментов файла СИНТАКСИС |#include <unistd.h> | |int lockf (fildes, function, size) |long size; |int fildes, function; ОПИСАНИЕ Функция lockf позволяет блокировать отдельные сегменты файла. Учитывается ли блокировка при выполнении систем- ных вызовов ввода/вывода, определяется режимом доступа к файлу [см. chmod(2)]. Если другие процессы попытаются блокировать уже заблокированный сегмент, они либо полу- чат в ответ код ошибки, либо будут ждать освобождения ресурса. При завершении процесса все блокировки, уста- новленные им, удаляются. Более подробная информация о блокировке приведена в fcntl(2). Аргумент fildes - это дескриптор открытого файла. Чтобы функция lockf завершилась успешно, файл должен быть открыт с правом записи (O_WRONLY или O_RDWR). Аргумент function - это значение, задающее вполняемые действия. Допустимые значения определены во включаемом файле <unistd.h>: |#define F_ULOCK 0 /* Разблокировать ранее блокированный | сегмент */ | |#define F_LOCK 1 /* Заблокировать сегмент */ | |#define F_TLOCK 2 /* Проверить и заблокировать сегмент */ | |#define F_TEST 3 /* Проверить сегмент */ Другие значения function зарезервированы для будущих расширений и приводят к ошибке, если не реализованы. Значение F_TEST используется для определения того, не блокирован ли соответствующий сегмент файла каким-ни- будь другим процессом. F_LOCK и F_TLOCK блокируют ука- занный сегмент, если это возможно. F_ULOCK разблокирует ранее блокированный сегмент. Аргумент size задает количество последовательных байт файла, которые должны быть заблокированы или разблоки- рованы. Началом сегмента является текущая позиция в файле; сегмент распространяется вперед или назад по файлу, в зависимости от положительного или отрицатель- ного значения size (при распространении назад текущая позиция не включается в блокируемую или разблокируемую область). Если значение size равно 0, блокируется (или разблокируется) сегмент от текущей позиции до конца файла (текущего и любого будущего). Блокируемый сегмент не обязан существовать в файле, допустима блокировка областей за концом файла. Сегменты, блокируемые посредством F_LOCK и F_TLOCK, мо- гут полностью или частично пересекаться с сегментами, ранее блокированными тем же процессом. При обнаружении такого пересечения, а также при обнаружении смежных сегментов, создается один блокируемый сегмент, охваты- вающий все смежные байты. Если при блокировании созда- ется новый блокируемый сегмент, он заносится в таблицу блокировок; при нехватке места в этой таблице обращение к lockf завершается неудачей и блокировка не устанавли- вается. Запросы F_LOCK и F_TLOCK отличаются только действиями, которые производятся в случае, если блокировку осущест вить невозможно. F_LOCK приводит к ожиданию освобожде- ния ресурса. Запрос F_TLOCK, если сегмент уже блокиро- ван другим процессом, приводит к возврату значения -1 и присваивания переменной errno значения EACCES. Запрос F_ULOCK может полностью или частично разблокиро- вать один или более сегментов, заблокированных вызываю- щим процессом. Если сегмент разблокируется не пол- ностью, остаток остается блокированным. Разблокирование середины сегмента требует дополнительного элемента в таблице блокировок. При нехватке места в этой таблице возвращается значение -1, переменной errno присваивает ся значение EDEADLK и разблокировка не производится. Если процесс, захвативший ресурс, ждет освобождения другого ресурса другим процессом, может возникнуть ту пик, поэтому lockf и fcntl контролируют возможность об разования тупика, прежде чем начать ожидание ресурса. Если обнаруживается, что ожидание ресурса вызовет ту- пик, то возвращается значение -1, переменной errno присваивается значение EDEADLK и блокировка не произво- дится. Ожидание ресурса может быть прервано произвольным сиг налом. Для применений, в которых требуется временной контроль, рекомендуется пользоваться системным вызовом alarm(2). Функция lockf завершается неудачей, если выполнено хотя бы одно из следующих условий: [EBADF] Аргумент fd не является корректным дескрип тором открытого файла. [EACCES] Значение function равно F_TLOCK или F_TEST, а сегмент уже блокирован другим процессом. [EDEADLK] Значение function равно F_LOCK и может соз- даться тупик, или значение function равно F_LOCK, F_TLOCK или F_ULOCK, а в таблице блокировок не хватает места. [ECOMM] Fildes является дескриптором файла на уда ленном компьютере, связи с которым в данный момент нет. СМ. ТАКЖЕ chmod(2), close(2), creat(2), fcntl(2), intro(2), open(2), read(2), write(2). ДИАГНОСТИКА При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивает- ся код ошибки. ПРЕДОСТЕРЕЖЕНИЯ Для процесса, который занимается буферизацией ввода/вы- вода в адресном пространстве пользователя, результаты взаимодействия с механизмом блокировки могут оказаться непредсказуемыми: запись в заблокированный сегмент пройдет нормально, зато потом запись совсем в другое место может привести к ошибке из-за выталкивания буфе ров. Главным источником неожиданной буферизации являет- ся стандартный пакет ввода/вывода. Так как в будущем переменной errno будет присваиваться значение EAGAIN, вместо значения EACCES в случае, если сегмент файла уже блокирован другим процессом, для дос- тижения мобильности прикладных программ следует ожидать и обрабатывать оба кода ошибки.