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 & SEM_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 должен быть массивом структур, а не указателем на массив.@