[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Операции над семафорами

Системный вызов  semop(2) производит  операции над  одним или более
семафорами из  набора. Операции  увеличивают или уменьшают значение
семафора на  заданную величину, или ожидают, пока семафор не станет
нулевым.

Аргументы этого системного вызова таковы:

semid Идентификатор набора семафоров, полученный от semget(2).

sops  Адрес  массива  с  элементом  типа  struct  sembuf,  задающих
      операции над  семафорами. По  этому адресу должно размещаться
      nsops таких  структур.  Эта  структура  определена  следующим
      образом:

      sys/sem.h:
      struct sembuf {
          ushort sem_num; /* semaphore */
          short sem_op;   /* semaphore operation */
          short sem_flg;  /* operation flags */
      };

      Поля этой структуры имеют следующий смысл:

      sem_num Индекс семафора, над которым производится операция, в
              наборе.

      sem_op  Если это  значение положительно,  оно  добавляется  к
              текущему значению  семафора.    Обычно  это  означает
              разблокировку   или   освобождение   соответствующего
              количества ресурсов.
              Если sem_op  отрицательно, и  его абсолютное значение
              больше текущего  значения семафора,  операция  обычно
              блокируется. Иначе,  из  семафора  просто  вычитается
              абсолютное значение  этого поля.  Обычно это означает
              блокировку  или  захват  соответствующего  количества
              ресурсов.
              Если sem_op  равен нулю,  операция блокируется,  пока
              семафор не станет нулевым.

      sem_flg Это  поле     задает  дополнительные  флаги.  Нулевое
              значение   означает,    что   не    задано    никаких
              флагов.Допустимы следующие флаги:

              IPC_NOWAIT Если установлен  этот флаг,  и операция не
                         может быть  выполнена, semop(2) возвращает
                         неуспех   вместо    блокировки,    которая
                         происходит обычно.  Этот флаг  может  быть
                         использован  для   анализа   и   изменения
                         значения семафора без блокировки.
              SEM_UNDO   Если этот  флаг установлен, при завершении
                         программы   (как    нормальном,   так    и
                         ненормальном),  значение   семафора  будет
                         установлено  таким,   какое  оно  было  до
                         операции.  Это  защищает  от  "посмертной"
                         блокировки  ресурса   программой,  которая
                         ненормально    завершилась,    не    успев
                         освободить ресурс.
      Замечание:   При    выполнении   операции   над   несколькими
      семафорами, значения семафоров не меняются, пока не окажется,
      что все  требуемые операции  могут  быть  успешно  выполнены.
      Помните,  что  блокировка  может  произойти  при  работе  без
      IPC_NOWAIT, когда  программа ожидает  нулевого  значения  или
      пытается выполнить вычитание.

nsops Количество структур  в массиве,  на который  указывает  sops.
      nsops должен всегда быть больше или равен 1.
                      ОПЕРАЦИИ НАД СЕМАФОРАМИ
semop(2)

ИМЯ

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

ИСПОЛЬЗОВАНИЕ

  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/sem.h>

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

          успех - ноль

          неуспех - -1 и errno установлена