Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

Обязательная блокировка

Обязательная блокировка является более строгой: когда установлена обязательная блокировка, ни один другой процесс не может получить доступ к заблокированному файлу. Любой процесс, который пытается игнорировать это, либо сам блокируется до снятия блокировки файла, либо его попытка завершится неудачей. (Под GNU/Linux по крайней мере это включает

root
!)

Вспомогательная блокировка достаточна для взаимодействующих программ, разделяющих индивидуальный файл, когда не предполагается использование этого файла ни одним другим приложением. Обязательная блокировка подходит в ситуации, когда избежание конфликта в использовании файла является критическим, как в коммерческих системах баз данных.

POSIX стандартизует лишь вспомогательную блокировку. Обязательная блокировка доступна на GNU/Linux, а также в ряде коммерческих систем Unix, но детали варьируют. Далее в данном разделе мы рассмотрим детали для GNU/Linux.

14.2.2. Блокировка POSIX:

fcntl
и
lockf

Системный вызов

fcntl
(file control — управление файлом) используется для блокировки файла. (Другое использование
fcntl
было описано в разделе 9.4.3 «Управление атрибутами файла:
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);

Аргументы следующие:

fd
Дескриптор файла для открытого файла.

cmd
Одна или более именованных констант, определенных в
<fcntl.h>
. Ниже они описаны более подробно.

lock
Указатель на
struct flock
, описывающую нужный блок.

14.2.2.1. Описание блокировки

Прежде чем рассмотреть осуществление блокировки, давайте исследуем описание блокировки в операционной системе. Это делается при помощи структуры

struct flock
, которая описывает диапазон блокируемых байтов и вид нужной блокировки. Стандарт POSIX утверждает, что
struct lock
содержит «по крайней мере» определенные члены. Это позволяет разработчикам предоставлять при желании дополнительные члены структуры. Из слегка отредактированной справочной страницы fcntl(3):

struct 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_start
является смешением начального байта блокируемого участка.
l_len
является длиной блокируемого участка, т. е. общим числом блокируемых байтов.
l_whence
указывает место в файле, относительно которого отсчитывается
l_start
, значения те же, что и для аргумента
whence
функции
lseek
(см раздел 4.5 «Произвольный доступ: перемещения внутри файла»), отсюда и название поля. Эта структура самодостаточна: смещение
l_start
и значение
l_whence
не связаны с текущим файловым указателем для чтения или записи. Пример кода мог бы выглядеть таким образом:

struct employee { /* что угодно */ }; /* Описание сотрудника */

struct flock lock; /* Структура блока */

...

/* Заблокировать структуру для шестого сотрудника */

lock.l_whence = SEEK_SET; /* Абсолютное положение */

lock.l_start = 5 * sizeof(struct employee); /* Начало 6-й структуры */

lock.l_len = sizeof(struct employee); /* Блокировать одну запись */

Используя

SEEK_CUR
или
SEEK_END
, вы можете заблокировать участки, начиная от текущего смещения в файле или относительно конца файла соответственно. Для этих двух случаев
l_start
может быть отрицательным, пока абсолютное начало не меньше нуля. Таким образом, чтобы заблокировать последнюю запись в файле:

/* Заблокировать запись последнего сотрудника */

lock.l_whence = SEEK_END; /* Относительно EOF */

lock.l_start = -1 * sizeof (struct employee);

  • Читать дальше
  • 1
  • ...
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: