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


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


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

Аргумент sops указывает на массив типа sembuf. Эта структура описана в linux/sem.h следующим образом: /* системный вызов semop требует массив таких структур */ struct sembuf { ushort sem_num; /* индекс семафора в массиве */ short sem_op; /* операция над семафором */ short sem_flg; /* флаги */ };

sem_num

Номер семафора, с которым вы собираетесь иметь дело.

sem_op

Выполняемая операция (положительное, отрицательное число или нуль).

sem_flg

Флаги операции.

Если sem_op отрицателен, то его значение вычитается из семафора (семафор уменьшается - перев.). Это соответствует получению ресурсов, которые контролирует семафор. Если IPC_NOWAIT не установлен, то вызывающий процесс засыпает, пока семафор не выдаст требуемое количество ресурсов (пока другой процесс не освободит их).

Если sem_op положителен, то его значение добавляется к семафору. Это соответствует возвращению ресурсов множеству семафоров приложения. Ресурсы всегда нужно возвращать множеству семафоров, если они больше не используются!

Наконец, если sem_op равен нулю, то вызывающий процесс будет усыплен (sleep()), пока значение семафора не станет нулем. Это соответствует ожиданию того, что ресурсы будут использованы на 100%. Хорошим примером был бы демон, запущенный с суперпользовательскими правами, динамически регулирующий размеры множества семафоров, если оно достигло стопроцентного использования.

Чтобы пояснить вызов semop, вспомним нашу комнату с принтерами. Пусть мы имеем только один принтер, способный выполнять только одно задание за раз. Мы создаем множество семафоров из одного семафора (только один принтер) и устанавливаем его начальное значение в 1 (только одно задание за раз).

Каждый раз, посылая задание на принтер, нам нужно сначала убедиться, что он свободен. Мы делаем это, пытаясь получить от семафора единицу ресурса. Давайте заполним массив sembuf, необходимый для выполнения операции: struct sembuf sem_lock = { 0, -1, IPC_NOWAIT };




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



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