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

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

Шрифт:

 /* Начало последней структуры */

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

Установка

l_len
в 0 является особым случаем. Он означает блокировку файла от начального положения, указанного с помощью
l_start
и
l_whence
, и до конца файла. Сюда входят также любые области за концом файла. (Другими словами, если заблокированный файл увеличивается в размере, область блокировки расширяется таким образом, чтобы продолжать охватывать весь файл.) Таким образом, блокирование всего файла является вырожденным случаем блокирования одной записи:

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

lock.l_start = 0; /* Начало файла */

lock.l_len = 0; /* До конца файла */

Справочная страница fnctl(3) имеет примечание:

POSIX 1003.1-2001 допускает отрицательные значения

l_len
. (И если это так, описываемый блоком интервал охватывает байты с
l_start + l_len
вплоть до
l_start - 1
включительно.) Однако, в этой ситуации системный вызов Linux для современных ядер возвращает
EINVAL
.

(Мы заметили, что справочная страница относится к версиям ядер 2.4.x; стоит проверить текущую справочную страницу, если ваша система новее.)

Теперь, когда мы знаем, как описать где блокируется файл, мы можем описать тип блокировки с помощью

l_type
. Возможные значения следующие:

F_RDLCK
Блокировка чтения. Для применения блокировки чтения файл должен быть открыт для чтения.

F_WRLCK
Блокировка записи. Для применения блокировки записи файл должен быть открыт для записи.

F_UNLCK
Освобождение предыдущей блокировки.

Таким образом, полная спецификация блокировки включает установку в структуре

struct flock
значений четырех полей: трех для указания блокируемой области и четвертого для описания нужного типа блока.

Значение

F_UNLCK
для
l_type
снимает блокировку. В общем, это простейший способ снять те самые блоки, которые были установлены ранее, но можно «расщепить» блок, освободив диапазон байтов в середине ранее установленного более крупного блока. Например:

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

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

...

/* Заблокировать сотрудников 6-8 */

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

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

lock.l_len = sizeof(struct employee) * 3; /* Заблокировать 3 записи */

/* ...установка блокировки (см. следующий раздел)... */

/* Освобождение записи 7: предыдущий блок расщепляется на два: */

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

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

lock.l_len = sizeof(struct employee) * 1; /* Разблокирование 1-й записи */

/* ...снятие блокировки (см. следующий раздел)... */

14.2.2.2. Установка и снятие блокировок

После заполнения структуры

struct flock
следующим шагом является запрос блокировки. Этот шаг осуществляется с помощью соответствующего значения аргумента
cmd
функции
fcntl
:

F_GETLK
Узнать, можно ли установить блокировку.

F_SETLK
Установить или снять блокировку.

F_SETLKW
Установить блокировку, подождав, пока это будет возможным.

Команда

F_GETLK
является командой «Мама, можно мне?» Она осведомляется, доступна ли описанная
struct flock
блокировка. Если она доступна, блокировка не устанавливается; вместо этого операционная система изменяет поле
l_type
на
F_UNLCK
. Другие поля остаются без изменений.

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

l_pid
содержит PID процесса, владеющего соответствующей блокировкой. [152] Если блокировка уже установлена, нет другого выбора, кроме ожидания в течение некоторого времени и новой попытки установки блокировки или вывода сообщения об ошибке и отказа от дальнейших попыток.

152

Справочная страница GNU/Linux fcntl(3) указывает, что этих сведений может быть недостаточно, процесс может находиться на другой машине! При блокировках по сети есть и другие проблемы, в общем, использование блокировки в файловых системах, смонтированных для удаленных компьютеров, не является удачной мыслью — Примеч. автора.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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