NAME
sseemmoopp - atomic array of operations on a semaphore set
SYNOPSIS
##iinncclluuddee <
int sseemmoopp(int semid, struct sembuf *sops, sizet nsops);> DESCRIPTION
The sseemmoopp() system call atomically performs the array of operations indi-
cated by sops on the semaphore set indicated by semid. The length of sops is indicated by nsops. Each operation is encoded in a struct sembuf, which is defined as follows: struct sembuf {ushort semnum; /* semaphore # */
short semop; /* semaphore operation */
short semflg; /* operation flags */ };For each element in sops, semop and semflg determine an operation to be
performed on semaphore number semnum in the set. The values SEMUNDO and IPCNOWAIT may be OR'ed into the semflg member in order to modify the behavior of the given operation.The operation performed depends as follows on the value of semop:
++oo When semop is positive and the process has alter permission, the
semaphore's value is incremented by semop's value. If SEMUNDO is
specified, the semaphore's adjust on exit value is decremented bysemop's value. A positive value for semop generally corresponds to
a process releasing a resource associated with the semaphore.++oo The behavior when semop is negative and the process has alter per-
mission, depends on the current value of the semaphore: ++oo If the current value of the semaphore is greater than or equal tothe absolute value of semop, then the value is decremented by
the absolute value of semop. If SEMUNDO is specified, the sem-
aphore's adjust on exit value is incremented by the absolutevalue of semop.
++oo If the current value of the semaphore is less than the absolutevalue of semop, one of the following happens:
++oo If IPCNOWAIT was specified, then sseemmoopp() returns immediately with a return value of EAGAIN. ++oo Otherwise, the calling process is put to sleep until one of the following conditions is satisfied: ++oo Some other process removes the semaphore with the IPCRMID option of semctl(2). In this case, sseemmoopp() returns immediately with a return value of EIDRM. ++oo The process receives a signal that is to be caught. In this case, the process will resume execution as defined by sigaction(2). ++oo The semaphore's value is greater than or equal to theabsolute value of semop. When this condition becomes
true, the semaphore's value is decremented by the abso-
lute value of semop, the semaphore's adjust on exit
value is incremented by the absolute value of semop.
A negative value for semop generally means that a process is waiting
for a resource to become available.++oo When semop is zero and the process has read permission, one of the
following will occur: ++oo If the current value of the semaphore is equal to zero then sseemmoopp() can return immediately. ++oo If IPCNOWAIT was specified, then sseemmoopp() returns immediately with a return value of EAGAIN. ++oo Otherwise, the calling process is put to sleep until one of the following conditions is satisfied: ++oo Some other process removes the semaphore with the IPCRMIDoption of semctl(2). In this case, sseemmoopp() returns immedi-
ately with a return value of EIDRM. ++oo The process receives a signal that is to be caught. In this case, the process will resume execution as defined by sigaction(2). ++oo The semaphore's value becomes zero. For each semaphore a process has in use, the kernel maintains an ``adjust on exit'' value, as alluded to earlier. When a process exits, either voluntarily or involuntarily, the adjust on exit value for each semaphore is added to the semaphore's value. This can be used to insure that a resource is released if a process terminates unexpectedly.RETURN VALUES
The sseemmoopp() function returns the value 0 if successful; otherwise thevalue -1 is returned and the global variable errno is set to indicate the
error. EERRRROORRSS The sseemmoopp() system call will fail if: [E2BIG] Too many operations are specified. [SEMOPM] [EACCES] Permission is denied, due to a mismatch between the operation and the mode of the semaphore set. [EAGAIN] The semaphore's value would result in the process being put to sleep and IPCNOWAIT is specified. [EFBIG] semnum is not in the range of valid semaphores for the set. [EIDRM] The semaphore set is removed from the system. [EINTR] The sseemmoopp() system call is interrupted by a signal. [EINVAL] No semaphore set corresponds to semid, or the processwould exceed the system-defined limit for the number
of per-process SEMUNDO structures.
[ENOSPC] The system SEMUNDO pool [SEMMNU] is full.[ERANGE] The requested operation would cause either the sema-
phore's current value [SEMVMX] or its adjust-on-exit
value [SEMAEM] to exceed the system-imposed limits.
LEGACY SYNOPSIS
##iinncclluuddee <
> ##iinncclluuddee <
> ##iinncclluuddee <
The include files> and are necessary. SEE ALSO
semctl(2), semget(2), sigaction(2), compat(5)BUGS
The sseemmoopp() system call may block waiting for memory even if IPCNOWAIT was specified. BSD September 22, 1995 BSD