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 — значение семафора вышло за пределы допустимых значений.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Операции над семафорами
Операции над семафорами Создание семафора QNX поддерживает два типа семафоров — неименованные и именованные. Разница между ними заключается в том, что к именованному семафору можно обратиться из любого процесса в системе (или даже по сети QNET с другого сетевого хоста),
Выполнение основных операций с файловой системой
Выполнение основных операций с файловой системой Для работы с файловой системой из сценариев WSH предназначены восемь объектов, главным из которых является FileSystemObject. С помощью методов объекта FileSystemObject можно выполнять следующие основные действия:? копировать или
if - Выполнение или не выполнение предложений в зависимости от условий
if - Выполнение или не выполнение предложений в зависимости от условий ifПозволяет выполнить или не выполняет определенные предложения в зависимости от заданного условияСинтаксис:if (condition) { statements}Аргументы:В целом, предложение if завершается закрывающей фигурной скобкой
Контроль операций NTP
Контроль операций NTP Помимо визуального контроля показаний часов с помощью программы xclock, для мониторинга операций NTP часто применяется программа ntpq. После вызова эта программа запрашивает команды, определяющие ее дальнейшую работу. Команды вводятся в текстовом режиме.
36. Перегрузка операций
36. Перегрузка операций Часто программы имеют дело с объектами, которые являются представлениями абстрактных понятий. К примеру, тип данных int в C++ вместе с операциями +, —, *, / и т. д. является реализацией математического понятия целых чисел. Подобные понятия чаще всего
12.4.2. Совмещение операций
12.4.2. Совмещение операций В главе 5 сравнивались протоколы РОРЗ и IMAP для опроса удаленных почтовых серверов. При этом было отмечено, что IMAP-запросы (в отличие от РОРЗ-запросов) маркируются идентификатором запроса, сгенерированным клиентом. Сервер, отправляя обратно ответ,
7.8. Выполнение для последовательностей операций над множествами
7.8. Выполнение для последовательностей операций над множествами ПроблемаИмеются последовательности, которые требуется реорганизовать с помощью операций над множествами, таких как объединение (union), различие (difference) или пересечение (intersection).РешениеДля этой цели
11.19. Выполнение операций с битовыми наборами
11.19. Выполнение операций с битовыми наборами ПроблемаТребуется реализовать основные арифметические операции и операции сравнения для набора бит, рассматривая его как двоичное представление целого числа без знака.РешениеПрограммный код примера 11.36 содержит функции,
Перегрузка операций
Перегрузка операций В C#, как и в любом другом языке программирования, есть свой ограниченный набор лексем, используемых для выполнения базовых операций со встроенными типами. Так, вы знаете, что операция + применима к двум целым числам и в результате дает их сумму.//
Старшинство операций
Старшинство операций В соответствии с принятым в языке Си порядком вычислений операции увеличения и уменьшения имеют очень высокий уровень старшинства; только круглые скобки обладают более высоким приоритетом. Поэтому выражение x*y++ означает (x)*(y++), а не (x*y)++, что
7.11. Синхронное выполнение задач с помощью операций
7.11. Синхронное выполнение задач с помощью операций Постановка задачи Необходимо синхронно выполнить серию
7.12. Асинхронное выполнение задач с помощью операций
7.12. Асинхронное выполнение задач с помощью операций Постановка задачи Требуется параллельно выполнять
Старшинство операций
Старшинство операций Теперь, когда мы изучили все типы операций XPath, можно дать синтаксическое определение выражению и выстроить все операции в порядке старшинства.Выражению, как самой общей конструкции XPath, соответствует продукция Expr, которая определяется следующим
Урок 9. Выполнение операций
Урок 9. Выполнение операций Вам наверняка понадобится изменять данные, хранящиеся в переменной. Мы уже рассматривали, как с помощью команд ++ или += изменять значение переменной. В вашем распоряжении также имеется большой набор других операций.Давайте начнем с переменных,
Приоритет операций
Приоритет операций Приоритет определяет порядок выполнения операций в выражении. Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие одинаковый приоритет, выполняются слева направо.Таблица приоритетов операций @, not, ^, +, - (унарные), new 1
Колисниченко Денис Николаевич
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉