[<<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 пытается изменить запись - блокировка