[<<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);