Операционная система UNIX. Руководство программиста


Блокировка и разблокирование сегментов - часть 3


Теперь рассмотрим сходный пример с использованием функции lockf(3C). Так как она не позволяет выполнять блокировку на чтение, под блокировкой будет пониматься блокировка на запись.

/* Повышение уровня блокировки с использованием lockf(3C). Предполагается, что в тот момент, когда программа будет выполняться, сегменты here и next не будут заблокированы. Если блокировка удастся, то: блокируем сегмент this; возвращаем указатель на сегмент this. Если любая из попыток блокировки окончится неудачей, то: разблокируем все остальные сегменты; возвращаем -1. */

#include <unistd.h>

long set3lock (this, here, next) long this, here, next; { /* Блокируем сегмент here */ (void) lseek (fd, here, 0); if (lockf (fd, F_LOCK, sizeof (struct record)) < 0) { return (-1); }

/* Блокируем сегмент this */ (void) lseek (fd, this, 0); if (lockf (fd, F_LOCK, sizeof (struct record)) < 0) { /* Блокировка сегмента this не удалась. Разблокируем here */ (void) lseek (fd, here, 0); (void) lockf (fd, F_ULOCK, sizeof (struct record)); return (-1); }

/* Блокируем сегмент next */ (void) lseek (fd, next, 0); if (lockf (fd, F_LOCK, sizeof (struct record)) < 0) { /* Блокировка сегмента next не удалась. Разблокируем сегмент here...*/ (void) lseek (fd, here, 0); (void) lockf (fd, F_ULOCK, sizeof (struct record)); /*...и разблокируем сегмент this */ (void) lseek (fd, this, 0); (void) lockf (fd, F_ULOCK, sizeof (struct record)); return (-1); /* Не смогли заблокировать */ } return (this); }

Блокировка снимается тем же способом, что и устанавливается, только в случае системного вызова fcntl(2) в качестве режима блокировки указывается F_UNLCK, а при использовании функции lockf(3C) - F_ULOCK. Разблокирование не может быть предотвращено другим процессом. Разблокирование можно производить только в отношении блокировок, ранее установленных тем же процессом. Разблокирование касается только сегментов, которые были заданы в предыдущем примере структурой lck. Можно производить разблокирование или изменять тип блокировки для части ранее блокированного сегмента, однако это может привести к появлению дополнительного элемента в системной таблице блокировок.




- Начало -  - Назад -  - Вперед -



Книжный магазин