26.6.3. Контроль семафора

26.6.3. Контроль семафора

Для контроля семафора используется системный вызов semctl():

int semctl(int semid, int semnum, int cmd, union semun arg);

Первый аргумент — это идентификатор семафора, второй — номер семафора во множестве семафоров (нумерация начиняется с 0). В отличие от очереди сообщений, где достаточно было указать только идентификатор очереди, при работе с семафорами нужно обязательно указывать номер конкретного семафора, над которым вы хотите выполнить операцию. Третий аргумент — это команда, которую нужно выполнить над семафором. Возможные команды представлены в таблице 26.1.

Команды управления семафорами Таблица 26.1

Команда Назначение
IPC_STAT Запоминает структуру semid_ds для множества по адресу buf объединения semun (чуть позже мы подробно рассмотрим эту структуру и объединение semun)
IPC_SET Устанавливает значение члена ipc_perm структуры semid_ds
IPC_RMID Удаляет множество
GETALL Позволяет получить значения всех семафоров. Значения возвращаются в виде массива unsigned short, на который указывает член объединения array
GETNCNT Возвращает число процессов, которые ожидают ресурсы в данный момент
GETPID Возвращает PID процесса, выполнившего последний вызов semop()
GETVAL Возвращает значение одного семафора
GETZCNT Возвращает число процессов, которые ожидают полного освобождения ресурса
SETALL Устанавливает значение семафоров. Значения берутся из члена array объединения semun
SETVAL Устанавливает значение конкретного семафора. Значение берется из элемента val объединения semun

Последний аргумент — это объединение (union) аргументов, которые можно использовать для управления семафором. Рассмотрим подробнее это объединение, объявленное в файле /usr/src/linux/include/linux/sem.h:

union semun {

 int val; /* значение для SETVAL */

 struct semid_ds *buf; /* буфер для IPC_STAT и IPC_SET */

 ushort *array; /* массив для GETALL и SETALL */

 struct seminfo *__buf; /* буфер для IPC_INFO */

 void *__pad;

};

Первый член этого объединения val используется для установки значения одного семафора при использовании команды SETVAL.

Член buf используется командами IPC_STAT и IPC_SET. Это копия внутренней структуры данных семафора.

Указатель на массив array используется командами GETALL и SETALL для получения или установки значений всех семафоров во множестве.

Последние два члена объединения специфичны только для Linux — в других UNIX-системах вы их не найдете. Эти элементы использует ядро.

В случае успеха системный вызов semctl() возвращает натуральное число, а в случае ошибки -1. Переменная errno равна:

? EACCESS — не хватает полномочий;

? EFAULT — адрес arg ошибочен;

? EIDRM — множество помечено для удаления:

? EINVAL — неправильный аргумент semid;

? EPERM — у вас нет прав для выполнения команды cmd;

? ERANGE — значение семафора вышло за пределы допустимых значений.

Пример получения значения семафора с номером N из множества sid:

int val;

val=semctl(sid, N, GETVAL, 0);

Предположим, что нам нужно вывести состояние всех трех имеющихся принтеров:

int c, val;

for (c=0; x<3; c++) {

val=semctl(sid,c,GETVAL,0);

printf("Принтер %d: %d ",c,val);

}

А вот код инициализации всех семафоров множества semid:

union semun opts;

int c;

opts.val = 1; /* первоначальное значение семафоров */

for (c=0;c<5;c++) semctl(semid, c, SETVAL, opts);

Довольно часто возникают определенные сложности с установкой прав доступа к множеству семафоров. Рассмотрим следующий код, позволяющий установить права доступа к множеству semid. Права доступа задаются в виде строки, например, «0660».

void sem_change_mode(int semid, char *mode) {

 int res;

 struct semid_ds semds;

 union semun opts;

 /* Нужно указать нашу локальную копию структуры */

 opts.buf = &semds;

 if ((res = semctl(semid, 0, IPC_STAT, opts)) == -1) {

  printf("Error");

  exit(1);

 }

 printf("Старые права доступа %o ",

 opts.buf->sem_perm.mode);

 /* Изменяем права доступа */

 sscanf(mode, "%ho", &opts.buf->sem_perm.mode);

 /* Обновляем внутреннюю структуру */

 semctl(sid, 0, IPC_SET, opts);

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.2.3.5. Синтаксический контроль

Из книги Прикладное программное обеспечение: системы автоматической обработки текстов автора Мальковский Михаил Георгиевич

3.2.3.5. Синтаксический контроль Программа СИНТ1Программа СИНТ1 находит в указанной области именные словосочетания вида ‹прилагательное› + ‹существительное› и ‹существительное› + ‹существительное в форме родит. падежа› и др. Программа может оказаться


3.2.3.6. Пунктуационный контроль

Из книги Сущность технологии СОМ. Библиотека программиста автора Бокс Дональд

3.2.3.6. Пунктуационный контроль Пунктуационные ошибки в реальных предложениях русского языка встречаются довольно часто. Разделим их условно на две группы. Ошибки одной группы связаны с уровнем пунктуационной грамотности и появляются в основном в тех типах текстов


3.2.3.7. Семантический контроль

Из книги Процессы жизненного цикла программных средств автора Автор неизвестен

3.2.3.7. Семантический контроль Программа СЕМ1Программа обнаруживает несовпадение ожидаемых семантических признаков актантов (подлежащее, дополнения) глагола и признаков слов (групп слов), реально занимающих соответствующие позиции. Такое несовпадение мешает завершить


Контроль доступа

Из книги Windows Vista без напряга автора Жвалевский Андрей Валентинович


Родительский контроль

Из книги VBA для чайников автора Каммингс Стив

Родительский контроль Дети очень быстро учатся пользоваться компьютером. Безо всяких книг, систем помощи или компьютерных курсов.Правда, пользуются дети компьютером только для игр (где они этого насмотрелись?!). Ну, еще для путешествий по Интернету, где они только болтают


Инициализация значения семафора

Из книги Интернет для ваших родителей автора Щербина Александр

Инициализация значения семафора В комментариях к исходному коду в издании этой книги 1990 года неправильно утверждалось, что значения семафоров набора инициализируются нулем при вызове semget с созданием нового семафора. Хотя в некоторых системах это действительно


Дросселирование семафора для уменьшения состязательности между потоками

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Дросселирование семафора для уменьшения состязательности между потоками Слишком большое количество потоков, соревнующихся между собой за право владения единственным ресурсом, например, мьютексом или объектом CS, могут стать причиной снижения производительности как в


Контроль доступа

Из книги автора

Контроль доступа Ограничивать доступ к компьютеру можно и нужно. Как это сделать и какую программу выбрать — зависит только от вас. ведь каждый случай уникален. В большинстве случаев утилиты для контроля доступа к ресурсам компьютера предназначены для авторизации


Контроль над Помощником

Из книги автора

Контроль над Помощником Используйте свойства объекта Assistant (табл. 14.1) для контроля за тем, как и когдаПомощник по Office будет появляться на экране. Пока вы не уверены в том. что Помощник уже включен, убедитесь в том, что его свойство On имеет значение True, прежде чем пытаться


Родительский контроль

Из книги автора

Родительский контроль Существует способ ограничить доступ детей к определенным сайтам, играм, да и, вообще, к самому компьютеру. Скажем, после 21 часа работа на компьютере запрещена.Для этого в панели управления создается для ребенка учетная запись с ограниченными


Создание семафора

Из книги автора

Создание семафора QNX поддерживает два типа семафоров — неименованные и именованные. Разница между ними заключается в том, что к именованному семафору можно обратиться из любого процесса в системе (или даже по сети QNET с другого сетевого хоста), поскольку такой семафор


Получение статуса семафора

Из книги автора

Получение статуса семафора int sem_getvalue(sem_t* sem, int* value);Эта функция используется преимущественно для отладки операций над семафорами. По адресу, указанному в value, устанавливается текущее значение счетчика семафора. Поскольку значение счетчика семафора может измениться в


Использование семафора

Из книги автора

Использование семафора Как уже говорилось выше, семафор является крайне гибким и эффективным средством синхронизации, особенно удобным для построения собственных средств планирования выполнения потоков. В этом смысле семафор представляет ценность не только как