[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Сценарий обязательного захвата записи

Обязательный захват записи взаимодействует с подсистемой ввода/вывода.
Эта форма захвата поддерживается такими системными вызовами, как
creat(2), open(2), read(2) или write(2). Если запись захвачена, то
доступ к ней со стороны любого другого процесса ограничен, в
зависимости от типа захвата. Контроль над записью осуществляется тем
не менее явно установкой подходящего захвата записи перед операцией
ввода/вывода, но системой выполняется добавочная проверка перед каждой
операцией ввода/вывода, чтобы убедиться, что протокол захвата записи
ведется правильно. Обязательное захватывание является хорошим
механизмом синхронизации, но ценой дополнительных накладных расходов
системы.
Обязательное захватывание - это атрибут файла. Он устанавливается
включением бита "установка идентификатора группы" и выключением бита
"разрешение выполнения группой". Это может быть удобно сделано
следующим образом:
$ chmod +l filename      #that's an "ell"
Установка атрибутов обязательного захвата записи не захватывает файл.
Единственный путь установки захвата - использование fcntl(2) или
lockf(3C). Обязательное захватывание защищает только те записи в
файле, на которые установлен захват.
Сценарий на следующей странице имеет дело с четырьмя процессами,
которые хотят получить доступ к одной и той же записи в файле.
Процесс A захватывает запись по изменению с помощью fcntl(2). Любой
другой процесс, пытающийся установить захват записи по чтению или
изменению, будет приостановлен, пока процесс A не снимет свой захват.
Заметим, что эти процессы - несовместные. Когда процесс A освобождает
запись, процесс D может писать, пока процесс B читает.

_________________________________________________

Сценарий:

1.   Процесс A устанавливает захват по изменению - успех

2.   Процесс В пытается установить захват по чтению - блокировка

3.   Процесс C пытается установить захват по чтению - блокировка

4.   Процесс D пытается изменить запись - блокировка