SEMOP(2) SEMOP(2)
НАЗВАНИЕ
semop - операции над множеством семафоров
СИНТАКСИС
#include
#include
#include
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 специфицирует одну из трех опера-
ций:
1. Если значение sem_op отрицательно, то выполняется
одно из следующих действий {Требуется право на из-
менение.}:
1.1. Если значение семафора semval [см. intro(2)]
больше или равно абсолютной величине sem_op,
то абсолютная величина sem_op вычитается из
значения semval. Аналогично, если выражение
(sem_flg & SEM_UNDO) истинно, то абсолютная
величина sem_op добавляется к значению пере-
менной semadj вызывающего процесса для задан-
ного семафора [см. exit(2)].
1.2. Если значение семафора semval меньше абсолют-
ной величины sem_op и выражение (sem_flg &
IPC_NOWAIT) истинно, то сразу же возвращается
управление вызывающему процессу.
1.3. Если значение семафора semval меньше абсолют-
ной величины sem_op и выражение (sem_flg &
IPC_NOWAIT) ложно, то увеличивается значение
semncnt соответствующего семафора и приоста-
навливается выполнение вызывающего процесса
до появления одного из следующих событий:
Значение semval становится большим или
равным абсолютной величине sem_op. Когда
это происходит, то соответствующее задан-
ному семафору значение semncnt уменьшается
на 1, абсолютная величина sem_op вычитает-
ся из значения semval и, если выражение
(sem_flg & IPC_UNDO) истинно, абсолютная
величина sem_op добавляется к значению
semadj вызывающего процесса для заданного
семафора.
Идентификатор множества семафоров, над ко-
торым вызывающий процесс выполняет опера-
цию, удаляется из системы [см. semctl(2)].
Когда это происходит, переменной errno
присваивается значение EIDRM и вызывающему
процессу возвращается -1.
Вызывающий процесс получает сигнал, кото-
рый должен быть обработан. Когда это про-
исходит, значение semncnt, соответствующее
заданному семафору, уменьшается на 1 и вы-
зывающий процесс возобновляет выполнение
так, как описано в signal(2).
2. Если значение sem_op положительно, то оно добавля-
ется к значению semval и, если выражение (sem_flg
& SEM_UNDO) истинно, значение sem_op вычитается из
значения semadj вызывающего процесса для заданного
семафора. {Требуется право на изменение.}
3. Если значение sem_op равно нулю, выполняется одно
из следующих действий {Требуется право на чтение}:
3.1. Если значение семафора semval равно нулю, то
управление сразу же возвращается вызывающему
процессу.
3.2. Если значение семафора не равно нулю и выра-
жение (sem_flg & IPC_NOWAIT) истинно, управ-
ление сразу же возвращается вызывающему про-
цессу.
3.3. Если значение семафора не равно нулю и выра-
жение (sem_flg & IPC_NOWAIT) ложно, то значе-
ние semzcnt для соответствующего семафора
увеличивается на 1 и выполнение вызывающего
процесса приостанавливается до появления од-
ного из следующих событий:
Значение semval становится равным нулю.
Когда это происходит, то соответствующее
заданному семафору значение semzcnt умень-
шается на 1.
Идентификатор множества семафоров, над ко-
торым вызывающий процесс выполняет опера-
цию, удаляется из системы. Когда это про-
исходит, переменной errno присваивается
значение EIDRM и вызывающему процессу
возвращается -1.
Вызывающий процесс получает сигнал, кото-
рый должен быть обработан. Когда это про-
исходит, значение semzcnt, соответствующее
заданному семафору, уменьшается на 1 и вы-
зывающий процесс возобновляет выполнение
так, как описано в signal(2).
Системный вызов semop завершается неудачей, если по
крайней мере для одной операции из набора выполнено хо-
тя бы одно из следующих условий:
[EINVAL] Значение аргумента semid не является кор-
ректным идентификатором множества семафо-
ров.
[EFBIG] Номер семафора sem_num меньше нуля или
больше или равен количеству семафоров в
множестве, определяемом идентификатором
semid.
[E2BIG] Количество заданных операций nsops больше
максимально допустимого в системе.
[EACCES] У вызывающего процесса нет прав на выполне-
ние операции [см. intro(2)].
[EAGAIN] Выполнение операции привело бы к приоста-
новке вызывающего процесса, а выражение
(semflg & IPC_NOWAIT) истинно.
[ENOSPC] Превышается максимально допустимое коли-
чество процессов, устанавливающих флаг
SEM_UNDO.
[EINVAL] Превышается максимально допустимое коли-
чество семафоров, для которых вызывающий
процесс устанавливает флаг SEM_UNDO.
[ERANGE] Значение семафора semval превышает макси-
мально допустимое системой.
[ERANGE] Значение semadj превышает максимально до-
пустимое системой.
[EFAULT] Аргумент sops указывает за пределы отведен-
ного процессу адресного пространства.
При успешном выполнении системного вызова значение
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 должен быть массивом
структур, а не указателем на массив.
|