[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Захват записи
Используемая при захвате структура flock приведена на следующей
странице. Чтобы выполнить захват записи, ваша программа должна
объявить struct flock, присвоить значение ее полям и передать адрес
struct flock системному вызову fcntl в качестве третьего аргумента.
Поля структуры захвата:
l_type указывает тип захвата. Его возможные значения:
F_RDLCK захват по чтению
F_WRLCK захват по изменению
F_UNLCK снятие захвата. Только процесс, который захватил
запись, может освободить ее. F_UNLCK будет проставлена
неявно, когда процесс завершается вызовом exit или
когда файл закрывается с помощью close(2).
Освобождение сегмента из середины большой записи
оставляет два захваченных сегмента с двух концов.
l_whence является признаком относительной стартовой позиции записи:
SEEK_SET (0) - от начала файла, SEEK_CUR (1) - от текущей
позиции в файле и SEEK_END (2) - от конца файла. Это поле
аналогично аргументу whence в системном вызове lseek(2).
l_start определяет начальную позицию записи в зависимости от
l_whence. Это поле аналогично аргументу offset вызова
lseek(2). l_start может быть отрицательным.
l_len определяет длину захватываемой записи. Значение ноль
захватывает/освобождает от начальной позиции до конца файла.
Например, захват всего файла достигается установкой в ноль
полей l_whence, l_start и l_len. Любые новые данные,
появляющиеся в файле, также будут захвачены.
l_pid устанавливается операционной системой равным идентификатору
процесса, который захватил запись, когда выполняется запрос
F_GETLK.
l_sysid устанавливается операционной системой равным системному
RFS-идентификатору этого файла, когда выполняется запрос
F_GETLK.
ЗАХВАТ ЗАПИСИ
fcntl.h:
typedef struct flock {
short l_type; /* F_RDLCK, F_WRLCK, F_UNLCK */
short l_whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start;
off_t l_len; /* len == 0 means until end of file */
long l_sysid;
pid_t l_pid;
long pad[4]; /* reserve area */
} flock_t;
/* file segment locking types */
#define F_RDLCK 01 /* Read lock */
#define F_WRLCK 02 /* Write lock */
#define F_UNLCK 03 /* Remove lock(s) */