26.6.2. Выполнение операций над семафорами

26.6.2. Выполнение операций над семафорами

Для выполнения операций над множеством семафоров служит системный вызов semop():

int semop(int semid, struct sembuf *sops, unsigned nsops);

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

Второй аргумент представляет собой массив типа sembuf:

struct sembuf {

 ushort sem_num; /* номер семафора в массиве */

 short sem_op; /* операция над семафором */

 short sem_flg; /* флаги */

};

? sem_num

Номер семафора, над которым нужно выполнить операцию

? sem_op

Выполняемая операция. Может быть отрицательным или положительным числом. Если число отрицательно, значение семафора будет уменьшено, а если положительным — увеличено. Не забывайте, освобождая ресурс, увеличивать значение семафора — за вас никто это не сделает. Если sem_op = 0, то процесс «заснет» и не «проснется» до тех пор, пока значение семафора не станет 0.

? sem_flg

Флаги операции, например, IPC_NOWAIT. Если IPC_NOWAIT не установлен, то процесс «заснет» до тех пор, пока не освободится указанное количество ресурсов (пока другой процесс не освободит их).

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

Перед посылкой задания на принтер нужно убедиться, что он свободен, то есть получить от семафора значение 1. Заполним массив sembuf необходимой для выполнения операции информацией:

struct sembuf prn_lock = {0, -1, IPC_NOWAIT};

Здесь 0 — это номер семафора: у нас всего один принтер, а нумерация начинается с нуля. -1 — это операция, запрашивающая единицу ресурса. Если принтер свободен, то после выполнения этой операции значение семафора принтера будет равно 0.

Мы также установили флаг IPC_NOWAIT, чтобы вызов прошел немедленно. Если принтер занят, вызов вернет ошибку:

if (semop(sid, &prn_lock, 1) == -1)

 printf("Принтер занят ");

Первый аргумент — это идентификатор объекта IPC, второй — это массив операций. Последний аргумент semop() говорит о том, что у нас есть только одна структура типа sembuf, то есть нам нужно выполнить только одну операцию.

После выполнения задания мы должны сообщить семафору об освобождении ресурса:

struct sembuf prn_unlock ={0, 1, IPC_NOWAIT};

semop(sid, &prn_unlock, 1);

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

? E2BIG — количество операций (аргумент nsops) превышает разрешенное число операций;

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

? EAGAIN — операция не может быть выполнена (при использовании флага IPC_NOWAIT), такую операцию нужно повторить снова;

? EFAULT — указатель sops указывает на ошибочный адрес;

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

? EINTR — прервано сигналом;

? EINVAL — неверный semid;

? ENOMEM — не хватает памяти для создания структуры Undo-операции;

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

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

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

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

36. Перегрузка операций

Из книги Программирование автора Козлова Ирина Сергеевна

36. Перегрузка операций Часто программы имеют дело с объектами, которые являются представлениями абстрактных понятий. К примеру, тип данных int в C++ вместе с операциями +, —, *, / и т. д. является реализацией математического понятия целых чисел. Подобные понятия чаще всего


Перегрузка операций

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Перегрузка операций В C#, как и в любом другом языке программирования, есть свой ограниченный набор лексем, используемых для выполнения базовых операций со встроенными типами. Так, вы знаете, что операция + применима к двум целым числам и в результате дает их сумму.//


12.4.2. Совмещение операций

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

12.4.2. Совмещение операций В главе 5 сравнивались протоколы РОРЗ и IMAP для опроса удаленных почтовых серверов. При этом было отмечено, что IMAP-запросы (в отличие от РОРЗ-запросов) маркируются идентификатором запроса, сгенерированным клиентом. Сервер, отправляя обратно ответ,


Выполнение основных операций с файловой системой

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Выполнение основных операций с файловой системой Для работы с файловой системой из сценариев WSH предназначены восемь объектов, главным из которых является FileSystemObject. С помощью методов объекта FileSystemObject можно выполнять следующие основные действия:? копировать или


if - Выполнение или не выполнение предложений в зависимости от условий

Из книги Справочник по Flash автора Коллектив авторов

if - Выполнение или не выполнение предложений в зависимости от условий ifПозволяет выполнить или не выполняет определенные предложения в зависимости от заданного условияСинтаксис:if (condition) { statements}Аргументы:В целом, предложение if завершается закрывающей фигурной скобкой


Контроль операций NTP

Из книги Сетевые средства Linux автора Смит Родерик В.

Контроль операций NTP Помимо визуального контроля показаний часов с помощью программы xclock, для мониторинга операций NTP часто применяется программа ntpq. После вызова эта программа запрашивает команды, определяющие ее дальнейшую работу. Команды вводятся в текстовом режиме.


Старшинство операций

Из книги Технология XSLT автора Валиков Алексей Николаевич

Старшинство операций Теперь, когда мы изучили все типы операций XPath, можно дать синтаксическое определение выражению и выстроить все операции в порядке старшинства.Выражению, как самой общей конструкции XPath, соответствует продукция Expr, которая определяется следующим


7.8. Выполнение для последовательностей операций над множествами

Из книги C++. Сборник рецептов автора Диггинс Кристофер

7.8. Выполнение для последовательностей операций над множествами ПроблемаИмеются последовательности, которые требуется реорганизовать с помощью операций над множествами, таких как объединение (union), различие (difference) или пересечение (intersection).РешениеДля этой цели


11.19. Выполнение операций с битовыми наборами

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

11.19. Выполнение операций с битовыми наборами ПроблемаТребуется реализовать основные арифметические операции и операции сравнения для набора бит, рассматривая его как двоичное представление целого числа без знака.РешениеПрограммный код примера 11.36 содержит функции,


Операции над семафорами

Из книги Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript автора Розенцвейг Гэри

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


Урок 9. Выполнение операций

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Урок 9. Выполнение операций Вам наверняка понадобится изменять данные, хранящиеся в переменной. Мы уже рассматривали, как с помощью команд ++ или += изменять значение переменной. В вашем распоряжении также имеется большой набор других операций.Давайте начнем с переменных,


Старшинство операций

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

Старшинство операций      В соответствии с принятым в языке Си порядком вычислений операции увеличения и уменьшения имеют очень высокий уровень старшинства; только круглые скобки обладают более высоким приоритетом. Поэтому выражение x*y++ означает (x)*(y++), а не (x*y)++, что


Приоритет операций

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

Приоритет операций Приоритет определяет порядок выполнения операций в выражении. Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие одинаковый приоритет, выполняются слева направо.Таблица приоритетов операций @, not, ^, +, - (унарные), new 1