next up previous contents index
Next: Программа-пример Up: Операции над множествами семафоров Previous: Операции над множествами семафоров   Contents   Index

Использование semop

В справочной статье semop синтаксис данного системного вызова описан так: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop (semid, sops, nsops) int semid; struct sembuf *sops; unsigned nsops; При успешном завершении результат системного вызова равен нулю; в случае неудачи возвращается -1.

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

Аргумент sops (массив структур) определяет, над какими семафорами будут выполняться операции и какие именно. Структура, описывающая операцию над одним семафором, определяется следующим образом: struct sembuf { short sem_num; /* Номер семафора */ short sem_op; /* Операция над семафором */ short sem_flg; /* Флаги операции */ }; (см. включаемый файл <sys/sem.h>).

Номер семафора задает конкретный семафор в множестве, над которым должна быть выполнена операция.

Выполняемая операция определяется следующим образом:

Допустимые значения флагов операций (поле sem_flg):
IPC_NOWAIT

Если какая-либо операция, для которой задан флаг IPC_NOWAIT, не может быть успешно выполнена, системный вызов завершается неудачей, причем ни у одного из семафоров не будет изменено значение

SEM\_UNDO

Данный флаг задает проверочный режим выполнения операции; он предписывает аннулировать ее результат даже в случае успешного завершения системного вызова semop. Иными словами, блокировка всех операций (в том числе и тех, для которых задан флаг SEM_UNDO) выполняется обычным образом, но когда наконец все операции могут быть успешно выполнены, операции с флагом SEM_UNDO игнорируются.

Аргумент nsops специфицирует число структур в массиве. Макси- мально допустимый размер массива определяется системным пара- метром SEMOPM, то есть в каждом системном вызове semop можно выполнить не более SEMOPM операций.



Alex Otwagin 2002-12-16