semop(2) semop(2)
NAME
semop - semaphore operations
SYNOPSIS
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, sizet nsops);
DESCRIPTION
semop() is used to perform atomically an array of semaphore operations
on the set of semaphores associated with the semaphore identifier
specified by semid. sops is a pointer to the array of semaphore-
operation structures. nsops is the number of such structures in the
array. The contents of each structure includes the following members:
ushortt semnum; /* semaphore number */
short semop; /* semaphore operation */
short semflg; /* operation flags */
Each semaphore operation specified by semop is performed on the cor-
responding semaphore specified by semid and semnum.
semop specifies one of three semaphore operations as follows, depend-
ing on whether its value is negative, positive, or zero:
If semop is a negative integer, one of the following occurs:
⊕ If the value of the semaphore semval is greater than or equal to
the absolute value of semop, the absolute value of semop is sub-
tracted from semval. Also, if (semflg&SEMUNDO) is true, the abso-
lute value of semop is added to the calling process' semadj value
[see exit(2)] for the specified semaphore.
⊕ If semval is less than the absolute value of semop and
(semflg&IPCNOWAIT) is true, semop() returns immediately.
⊕ If semval is less than the absolute value of semop and
(semflg&IPCNOWAIT) is false, semop() increments the semncnt asso-
ciated with the specified semaphore and suspends execution of the
calling process until one of the following conditions occurs:
- semval becomes greater than or equal to the absolute value of
semop. When this occurs, the value of semncnt associated with
the specified semaphore is decremented, the absolute value of
semop is subtracted from semval and, if (semflg&SEMUNDO) is
true, the absolute value of semop is added to the calling pro-
cess' semadj value for the specified semaphore.
- The semid for which the calling process is awaiting action is
removed from the system [see semctl(2)]. When this occurs, errno
is set equal to EIDRM, and a value of -1 is returned.
Page 1 Reliant UNIX 5.44 Printed 11/98
semop(2) semop(2)
- The calling process receives a signal that is to be caught. When
this occurs, the value of semncnt associated with the specified
semaphore is decremented, and the calling process resumes execu-
tion in the manner prescribed in signal(2).
If semop is a positive integer, the value of semop is added to
semval and, if (semflg&SEMUNDO) is true, the value of semop is sub-
tracted from the calling process' semadj value for the specified sema-
phore.
If semop is zero, one of the following occurs:
⊕ If semval is zero, semop() returns immediately.
⊕ If semval is not equal to zero and (semflg&IPCNOWAIT) is true,
semop() returns immediately.
⊕ If semval is not equal to zero and (semflg&IPCNOWAIT) is false,
semop() increments the semzcnt associated with the specified sema-
phore and suspends execution of the calling process until one of
the following occurs:
- semval becomes zero, at which time the value of semzcnt associ-
ated with the specified semaphore is decremented.
- The semid for which the calling process is awaiting action is
removed from the system. When this occurs, errno is set equal to
EIDRM, and a value of -1 is returned.
- The calling process receives a signal that is to be caught. When
this occurs, the value of semzcnt associated with the specified
semaphore is decremented, and the calling process resumes execu-
tion in the manner prescribed in signal(2).
semop() fails if one or more of the following apply for any of the
semaphore operations specified by sops:
EINVAL semid is not a valid semaphore identifier.
EFBIG semnum is less than zero or greater than or equal to the
number of semaphores in the set associated with semid.
E2BIG nsops is greater than the system-imposed maximum.
EACCES Operation permission is denied to the calling process.
Page 2 Reliant UNIX 5.44 Printed 11/98
semop(2) semop(2)
EAGAIN The operation would result in suspension of the calling pro-
cess but (semflg&IPCNOWAIT) is true.
ENOSPC The limit on the number of individual processes requesting an
SEMUNDO has been exceeded.
EINVAL The number of individual semaphores for which the calling
process requests a SEMUNDO will exceed the limit.
ERANGE semval exceeds the system-imposed limit.
ERANGE The semadj value exceeds the system-imposed limit.
EFAULT sops points to an illegal address.
Upon successful completion, the value of sempid for each semaphore
specified in the array pointed to by sops is set equal to the process
ID of the calling process.
RESULT
If semop() returns due to the receipt of a signal, a value of -1 is
returned to the calling process and errno is set to EINTR. If it
returns due to the removal of a semid from the system, a value of -1
is returned and errno is set to EIDRM.
Upon successful completion, a value of 0 is returned. Otherwise, a
value of -1 is returned and errno is set to indicate the error.
NOTES
In the future there may be modifications to the interfaces for inter-
process communication. You should design your applications so that in
modules using semop() this function can easily be replaced by others.
SEE ALSO
exec(2), exit(2), fork(2), semctl(2), semget(2), sem(5).
Page 3 Reliant UNIX 5.44 Printed 11/98