Операционная система UNIX. Руководство программиста

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


В статье semop(2) Справочника программиста синтаксис данного системного вызова описан так:

#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(2).

Аргумент sops (массив структур) определяет, над какими семафорами будут выполняться операции и какие именно. Структура, описывающая операцию над одним семафором, определяется следующим образом:

struct sembuf { short sem_num; /* Номер семафора */ short sem_op; /* Операция над семафором */ short sem_flg; /* Флаги операции */ };

(см. включаемый файл <sys/sem.h>).

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

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

  • Положительное значение поля sem_op предписывает увеличить значение семафора на величину sem_op.
  • Отрицательное значение поля sem_op предписывает уменьшить значение семафора на абсолютную величину sem_op. Операция не может быть успешно выполнена, если в результате получится отрицательное число.
  • Нулевое значение поля sem_op предписывает сравнить значение семафора с нулем. Операция не может быть успешно выполнена, если значение семафора отлично от нуля.

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

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

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



Содержание раздела