Основы программирования в Linux
□
;F_GETLK□
;F_SETLK□
.F_SETLKWКогда вы используете эти варианты, третий аргумент в вызове должен быть указателем на структуру
, поэтому на самом деле прототип вызова выглядит следующим образом:struct flock
<b>int fcntl(int fildes, int command, struct flock *flock_structure);</b>Структура
(он англ. file lock) зависит от конкретной реализации, но, как минимум, она будет содержать следующие элементы:flock□
;short l_type□
;short l_whence□
;off_t l_start□
;off_t l_len□
.pid_t l_pidЭлемент
принимает одно из нескольких значений (табл. 7.1), определенных в файле fcntl.h.l_typeТаблица 7.1.
Значение Описание F_RDLCKРазделяемая или совместная блокировка (блокировка на чтение). У разных процессов может быть разделяемая блокировка одних и тех же (или перекрывающихся) участков файла. Если у какого-либо процесса есть разделяемая блокировка, ни один процесс не сможет установить исключительную блокировку этого участка. Для получения совместной блокировки файл должен быть открыт с правом на чтение или на чтение/запись F_UNLCKРазблокировать. Применяется для снятия блокировок F_WRLCKИсключительная блокировка (или блокировка на запись). Только один процесс может установить исключительную блокировку на любой конкретный участок файла. После того как процесс установил такую блокировку, никакой другой процесс не сможет установить блокировку любого типа на этот участок файла. Для установки исключительной блокировки файл должен быть открыт с правом на запись или на чтение/запись Элементы
,l_whenceиl_startопределяют участок файла, непрерывную область в байтах. Элементl_lenдолжен задаваться одним из следующих значений:l_whence,SEEK_SET,SEEK_CUR(из файла unistd.h). Они соответствуют началу, текущей позиции или концу файла соответственно. ЭлементSEEK_ENDзадает смещение для первого байта участка файла, определенного элементомl_whence. Обычно оно задается константойl_start, поэтомуSEEK_SETотсчитывается от начала файла. Параметрl_startсодержит количество байтов в участке файла.l_lenПараметр
применяется для указания процесса, установившего блокировку; см. следующее далее описание значенияl_pidпараметраF_GETLK.commandДля каждого байта в файле может быть установлена блокировка только одного типа в каждый конкретный момент времени и может быть либо разделяемой блокировкой, либо исключительной или блокировка может отсутствовать. Для системного вызова
существует совсем немного комбинаций значений команд и вариантов, поэтому рассмотрим их все по очереди.fcntlЗначение F_GETLK параметра commandПервое значение параметра command —
. Эта команда получает информацию о файле, который открытF_GETLK(первый параметр в вызове). Она не пытается блокировать файл. В процессе вызова передаются сведения о типе блокировки, которую хотелось бы установить, и вызовfildesс командойfcntlвозвращает любую информацию, которая могла бы помешать установке блокировки.F_GETLKЗначения, используемые в структуре
, приведены в табл. 7.2.flockТаблица 7.2
Значение Описание l_typeИли для разделяемой (только чтение) блокировки, илиF_RDLCKдля исключительной (на запись) блокировкиF_WRLCKl_whenceОдно из значений: ,SEEK_SETилиSEEK_CURSEEK_END LCKl_startНачальный байт интересующего вас участка файла l_lenКоличество байтов в интересующем вас участке файла l_pidИдентификатор процесса, удерживающего блокировку Процесс может применять вызов с командой
для определения текущего состояния блокировки участка файла. Он должен настроить структуруF_GETLK, указав тип требуемой блокировки и определив интересующую его область файла. Вызовflockвозвращает в случае успешного завершения значение, отличное от -1. Если у файла уже есть блокировки, препятствующие установке требуемой блокировки, структураfcntlобновляется соответствующими данными. Если блокировке ничто не мешает, структураflockне изменяется. Если вызов с командойflockне может получить информацию, он возвращает -1 для обозначения аварийного завершения.F_GETLKЕсли вызов с командой
завершился успешно (т. е. вернул значение, отличное от -1), вызвавшее его приложение должно проверить, изменено ли содержимое структурыF_GETLK. Поскольку значениеflockсодержит идентификатор блокирующего процесса (если таковой найден), это поле очень удобно для того, чтобы проверить, изменялась ли структураl_pid.flockЗначение F_SETLK параметра commandЭта команда пытается заблокировать или разблокировать участок файла, заданного
. В табл. 7.3 приведены значения полей структурыfildes(отличающиеся от значений, применяемых командойflock).F_GETLKТаблица 7.3
Значение Описание l_typeОдно из следующих: • — для разделяемой или допускающей только чтение блокировки; •F_RDLCK— для исключительной или блокировки записи; •F_WRLCK— для разблокирования участкаF_UNLCKl_pidНе используется