Руководство программиста для Linux


Семафоры - часть 3


Первый аргумент semget() - это ключ (в нашем случае возвращается ftok()-ом). Он сравнивается с ключами остальных множеств семафоров, присутствующих в системе. Вместе с этим решается вопрос о выборе между созданием и подключением к множеству семафоров в зависимости от аргумента msgflg.

IPC_CREAT

Создает множество семафоров, если его еще не было в системе.

IPC_EXCL

При использовании вместе с IPC_CREAT вызывает ошибку, если семафор уже существует.

Если IPC_CREAT используется в одиночку, то semget() возвращает идентификатор множества семафоров - вновь созданного или с таким же ключом. Если IPC_EXCL используется совместно с IPC_CREAT, то либо создается новое множество, либо, если оно уже существует, вызов приводит к ошибке и -1. Сам по себе IPC_EXCL бесполезен, но вместе с IPC_CREAT он дает средство гарантировать, что ни одно из существующих множеств семафоров не открыто для доступа. Как и в других частях System V IPC, восьмеричный режим доступа может быть OR-нут в маску для формирования доступа к множеству семафоров.

Аргумент nems определяет число семафоров, которых требуется породить в новом множестве. Это количество принтеров в нашей корпоративной комнате. Максимальное число семафоров определяется в "linux/sem.h": #define SEMMSL 32 /* <= 512 */

Аргумент nsems игнорируется, если вы открвываете существующую очередь.

Напишем функции-переходники для открытия и создания множества семафоров.

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

Системный вызов semop() SYSTEMCALL: semop(); PROTOTYPE: int semop( int semid, struct sembuf *sops, unsigned nsops); RETURNS: 0 в случае успеха (все операции выполнены) -1 в случае ошибки errno: E2BIG (nsops больше чем максимальное число позволенных операций) EACCESS (доступ отклонен) EAGAIN (при поднятом флаге IPC_NOWAIT операция не может быть выполнена) EFAULT (sops указывает на ошибочный адрес) EIDRM (множество семафоров уничтожено) EINTR (сигнал получен во время сна) EINVAL (множество не существует или неверный semid) ENOMEM (поднят флаг SEM_UNDO, но не хватает памяти для создания необходимой undo-структуры) ERANGE (значение семафора вышло за пределы допустимых значений) NOTES:




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



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