[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 semctl(2) - Примеры

В прототипе semctl(2) последний параметр указан как union. Это
означает, что тип последнего параметра зависит от значения команды
cmd. На следующей странице приведены примеры использования
различных значений cmd. Ниже показано, какие типы arg используются
с различными командами:
 . int val;

     SETVAL    Эта  команда   устанавливает   значение   отдельного
               семафора в наборе.

 . struct semid_ds *buf;

     IPC_STAT  Эта команда  копирует состояние  набора семафоров  в
               буфер buf.

     IPC_SET   Эта команда устанавливает значения хозяина, группы и
               прав доступа для набора семафоров.

 . ushort *array;

     GETALL    Эта  команда  получает  значения  всех  семафоров  в
               наборе и  помещает их в массив, на который указывает
               array.

     SETALL    Устанавливает все  семафоры из  набора  в  значения,
               которые хранятся в  массиве array.

 . arg не используется

     GETVAL    Эта команда  получает значение  семафора с  индексом
               semnum.

     GETPID    Эта команда получает идентификатор процесса, который
               совершал последнюю операцию над семафором с индексом
               semnum.

     GETNCNT   Эта команда получает количество процессов, ожидающих
               увеличения значения семафора по сравнению с текущим.

     GETZCNT   Эта   команда    получает   количество    процессов,
               ожидающих, пока значение семафора не станет 0.

     IPC_RMID  Эта  команда   удаляет   набор   семафоров   и   его
               идентификатор.
                        semctl(2) - ПРИМЕРЫ
. описания и системный вызов для создания набора семафоров

  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/sem.h>
  #define ANY 0
  int semid, rtn;
  struct semid_ds ds;
  ushort us[5], init_us[5] = { 0, 6, 7, 1, 4 };
  ...
  semid = semget(key, 5, IPC_CREAT | 0660);

. инициализировать один семафор из набора

          semctl(semid, 2, SETVAL, 7);

. получить значение одного семафора из набора

     /* такой же формат для GETNCNT, GETZCNT, GETPID */
          rtn = semctl (semid, 2, GETVAL, ANY);

. инициализировать все семафоры в наборе

          semctl (semid, ANY, SETALL, init_us);

. получить все значения семафоров в наборе

          semctl (semid, ANY, GETALL, us);

. изменить хозяина

          /* также изменяются права доступа */
          semctl (semid, ANY, IPC_STAT, &ds);
          ds.sem_perm.uid = 51; /* new uid */
          semctl (semid, ANY, IPC_SET, &ds);

. удалить набор семафоров

          semctl (semid, ANY, IPC_RMID, ANY);