НАЗВАНИЕ
semop - операции над множеством семафоров
СИНТАКСИС
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop (semid, sops, nsops); int semid; struct sembuf **sops; unsigned nsops;
ОПИСАНИЕ
Системный вызов semop используется для выполнения набора операций над множеством семафоров, ассоциированным с
идентификатором semid. Значение аргумента sops является
указателем на массив структур, описывающих операции
(см. СЮРПРИЗЫ). Значение аргумента nsops равно количеству структур в массиве. Каждая структура, описывающая операцию, содержит следующие поля:
short sem_num; /* Номер семафора */ short sem_op; /* Операция над семафором */ short sem_flg; /* Флаги операции */
Каждая операция, специфицированная значением sem_op, выполняется над соответствующим семафором, заданным значениями semid и sem_num.
Значение поля sem_op специфицирует одну из трех операций:
Значение semval становится большим или равным абсолютной величине sem_op. Когда это происходит, то соответствующее заданному семафору значение semncnt уменьшается на 1, абсолютная величина sem_op вычитается из значения semval и, если выражение (sem_flg & IPC_UNDO) истинно, абсолютная величина sem_op добавляется к значению semadj вызывающего процесса для заданного семафора.
Идентификатор множества семафоров, над которым вызывающий процесс выполняет операцию, удаляется из системы [см. semctl(2)]. Когда это происходит, переменной errno присваивается значение EIDRM и вызывающему процессу возвращается -1.
Вызывающий процесс получает сигнал, который должен быть обработан. Когда это происходит, значение semncnt, соответствующее заданному семафору, уменьшается на 1 и вызывающий процесс возобновляет выполнение так, как описано в signal(2).
Значение semval становится равным нулю. Когда это происходит, то соответствующее заданному семафору значение semzcnt уменьшается на 1.
Идентификатор множества семафоров, над которым вызывающий процесс выполняет операцию, удаляется из системы. Когда это происходит, переменной errno присваивается значение EIDRM и вызывающему процессу возвращается -1.
Вызывающий процесс получает сигнал, который должен быть обработан. Когда это происходит, значение semzcnt, соответствующее заданному семафору, уменьшается на 1 и вызывающий процесс возобновляет выполнение так, как описано в signal(2).
Системный вызов semop завершается неудачей, если по крайней мере для одной операции из набора выполнено хотя бы одно из следующих условий:
При успешном выполнении системного вызова значение sempid для каждого семафора, заданного массивом структур, на который указывает sops, устанавливается равным идентификатору (номеру) вызывающего процесса.
СМ. ТАКЖЕ
exec(2), exit(2), fork(2), intro(2), semctl(2),
semget(2).
ДИАГНОСТИКА
Если системный вызов semop завершается неудачей из-за
получения сигнала, то вызывающему процессу возвращается
-1, а переменной errno присваивается значение EINTR.
Если системный вызов semop завершается неудачей из-за
удаления из системы идентификатора множества семафоров
semid , то возвращается -1 и errno присваивается значение EIDRM.
При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки.
СЮРПРИЗЫ
В данной реализации аргумент sops должен быть массивом
структур, а не указателем на массив.