semctl - производит операции управления семафорами
СИНТАКСИС
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
ОПИСАНИЕ
Функция semctl позволяет выполнять операции, определенные в cmd над набором семафоров, указанным в semid или над семафором с номером semnum из этого набора. (Семафоры нумеруются начиная с 0.)
Функция имеет три или четыре аргумента. Если аргументов четыре, то вызов выглядит как semctl(semid,semnum,cmd,arg); где четвертый аргумент arg имеет тип union semun, определенный как
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun
{
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* array for GETALL, SETALL */
/* Linux specific part: */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#endif
Аргумент cmd может принимать следующие значения:
IPC_STAT - Скопируйте информацию из структуры данных набора семафоров в структуру, указанную в arg.buf. Аргумент semnum игнорируется. Вызывающий процесс должен прочитать привилегии доступа в наборе семафоров.
IPC_SET - Внесите значения некоторых членов структуры semid_ds, на которую указывает arg.buf , в структуру данных набора семафоров и обновите sem_ctime. Присвоить следующим полям структуры данных struct semid_ds соответствующие значения, на которые указывает arg.buf
sem_perm.uid
sem_perm.gid
sem_perm.mode /* Только младшие 9 битов */
Эта команда может выполняться только процессом, который имеет действующий идентификатор пользователя, равный либо идентификатору суперпользователя, либо создателя или владельца набора семафоров. Аргумент semnum игнорируется.
IPC_RMID - Немедленно удалить из системы набор семафоров и структуры его данных, запускающие все процессы, находящиеся в режиме ожидания (при этом возвращается сообщение об ошибке, а errno присваивается значение EIDRM). Эта команда может выполняться только процессом, который имеет действующий идентификатор пользователя, равный либо идентификатору суперпользователя, либо создателя или владельца набора семафоров. Аргумент semnum игнорируется.
GETALL - Возвращает значение semval всем семафорам в массиве arg.array. Аргумент semnum игнорируется. Для этого вызывающему процессу нужны права на чтение.
GETNCNT - Системный вызов возвращает значение semncnt семафору semnum-th (например, число процессов, ожидающих увеличения значения semval семафора semnum-th). Для этого вызывающему процессу нужны права на чтение.
GETPID - Системный вызов возвращает значение sempid семафору semnum-th (например, идентификатор процесса, который последним делал вызов semop семафору semnum-th). Для этого вызывающему процессу нужны права на чтение.
GETVAL - системный вызов возвращает значение semval семафору semnum-th. Для этого вызывающему процессу нужны права на чтение.
GETZCNT - Системный вызов возвращает значение semzcnt семафору semnum-th (например, количество процессов, ожидающих, чтобы значение semval семафора semnum-th стало равным нулю). Для этого вызывающему процессу нужны права на чтение.
SETALL - Установить значение semval всех семафоров равным значениям элементов массива, на который указывает arg.array, изменяя также sem_ctime, являющееся членом структуры semid_ds ; а эта структура ассоциируется с набором семафоров. История отменяемых операций удаляется для всех измененных семафоров во всех процессах. Процессы, находящиеся в очереди, активизируются, если semval становится равным нулю или значение его увеличивается. Аргумент semnum игнорируется. Для этого вызывающему процессу нужны права на чтение.
SETVAL - Установите значение semval на указанное в arg.val для всех семафоров semnum-th, изменяя также sem_ctime в структуре semid_ds, соотносимой с набором семафоров. История отмененных операций удаляется для всех измененных семафоров во всех процессах. Процессы, находящиеся в очереди, активизируются, если semval становится равным нулю или значение его увеличивается. Вызывающему процессу потребуется право на его изменение.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При ошибке semctl вернет -1, а переменной errno присваивается номер ошибки. Иначе говоря, системный вызов возвращает положительное значение, зависящее от cmd:
GETNCNT - значение семафора равно semncnt.
GETPID - значение семафора равно sempid.
GETVAL - значение семафора равно semval.
GETZCNT - значение семафора равно semzcnt.
SEMGET
semget - считывает идентификатор набора семафоров
СИНТАКСИС
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
ОПИСАНИЕ
Системный вызов возвращает идентификатор набора семафоров, связанный с аргументом key. Создается новый набор из семафоров nsems , если значение key равно IPC_PRIVATE или c ключом key не связано ни одного существующего набора семафора, а выражение semflg & IPC_CREAT истинно.
Наличие в semflg полей IPC_CREAT и IPC_EXCL играет ту же роль, что и наличие O_CREAT и O_EXCL в аргументе, заданном для режима системного вызова open(). Например, фукция semget не выполняется, если semflg имеет флаги IPC_CREAT и IPC_EXCL, а набор семафоров уже существует для key.
Младшие 9 битов аргумента semflg определяют права доступа (для владельца, группы и остальных) к набору семафоров.Эти биты имеют тот же формат и те же значения, что и аргумент mode в функциях open() или creat() (хотя права на запуск для семафоров не имеют значения, а права на запись приравниваются к правам на изменение значений семафора).
При создании нового набора семафоров semget инициализирует связанную с семафором структуру данных semid_ds следующим образом:
sem_perm.cuid и sem_perm.uid присваиваются значения идентификаторов эффективного пользователя вызывающего процесса.
sem_perm.cgid и sem_perm.gid присваиваются значения идентификаторов эффективной группы пользователей вызывающего процесса.
Младшим 9 битам sem_perm.mode присваивается значение младших 9 битам semflg.
sem_nsems присваивается значение nsems.
sem_otime присваивается значение 0.
sem_ctime устанавливается на текущее время.
Аргумент nsems может быть равен 0, если набор семафоров не создается. Иначе аргумент nsems должен быть больше, чем 0 и меньше, либо равен максимальному количеству семафоров в наборе (SEMMSL).
Если набор семафоров уже существует, то проверяются права доступа.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении возвращаемое значение будет представлять собой идентификатор набора семафоров (целое неотрицательное значение), иначе возвращается -1, а переменной errno присваивается номер ошибки.
SEMOP
semop - операции над семафорами
СИНТАКСИС
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
ОПИСАНИЕ
Функция производит операции над выбранными элементами из набора семафоров semid. Каждый из элементов nsops в массиве sops определяет операцию, производимую над семафором в структуре struct sembuf, состоящей из полей:
short sem_num;/* semaphore number: 0 = first */
short sem_op;/* semaphore operation */
short sem_flg;/* operation flags */
Флаги в sem_flg могут иметь значения IPC_NOWAIT и SEM_UNDO. Если стоит флаг SEM_UNDO, то будет выполнена обратная операция при закрытии процесса.
Обратная операция будет выполнена только при условии выполнения предыдущей операции. Каждая операция выполняется над семафором sem_num набора, где первый семафор набора имеет номер 0, и его значение равно одному из трех следующих:
Если sem_op является положительным целым числом, то оно добавляется к semval. Если для операции стоит флаг SEM_UNDO, то система изменяет счетчик обратных операций для этого семафора. Операция все время производится и поэтому никогда не может перейти в режим ожидания. Вызывающий процесс должен иметь права на изменение набора.
Если sem_op равен нулю, то процесс должен иметь права на чтение набора. Если semval равен нулю, то операция производится без наличия дополнительных прав. Иначе, если флаг IPC_NOWAIT стоит в поле семафора sem_flg, системный вызов не выполняется (производятся все обратные операции), а errno присваивается значение EAGAIN. В другом случае semzcnt увеличивается на единицу, а процесс переходит в режим ожидания до того момента, когда
semval становится равным 0, а значение semzcnt увеличивается.
Набор семафоров удален, системный вызов не выполняется, а errno присваивается значение EIDRM.
Вызывающий процесс получает сигнал, который должен быть обработан; когда это происходит, значение semzcnt увеличивается, а системный вызов не выполняется, а переменной errno присваивается значение EINTR.
Если sem_op меньше нуля, то процесс должен иметь права на изменение набора. Если semval больше или равен абсолютному значению sem_op, то абсолютное значение sem_op приравнивается к semval. Если для этой операции установлен флаг SEM_UNDO, то счетчик обратных операций для этого семафора обновляется, а выполнение операции продолжается. Иначе, если флаг IPC_NOWAIT стоит в поле sem_flg, системный вызов не выполняется (производятся все обратные операции), а errno присваивается значение EAGAIN. В ином случае semncnt увеличивается на единицу, а процесс переходит в режим ожидания до того момента, когда
· semval становится больше или равно абсолютному значению sem_op, значение semncnt уменьшается, абсолютное значение sem_op приравнивается к semval, и если флаг SEM_UNDO установлен для этой операции, то система обновляет счетчик обратных операций для этого семафора.
· При удалении набора семафоров системный вызов не выполняется, а переменной errno присваивается значение EIDRM. Вызывающий процесс получает сигнал, после чего semncnt увеличивается, системный вызов не выполняется, а переменной errno присваивается значение EINTR.
· В случае выполнения sempid, являющейся членом структуры, sem приобретает значение идентификатора процесса. Так или иначе, sem_otime и sem_ctime устанавливаются на текущее время.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении системного вызова возвращаемое значение равно нулю, в случае ошибки оно равно -1, а переменной errno присваивается номер ошибки.