HP-UX Reference (11i v3 07/02) - 2 System Calls (vol 5)
s
semop(2) semop(2)
If semaphore value is zero, semop() proceeds to the next semaphore operation specified by sops
, or returns immediately if this is the last operation.
If semaphore value is not equal to zero and (sem_flg &
IPC_NOWAIT ) is "true", semop()
returns immediately.
If semaphore value is not equal to zero and (sem_flg &
IPC_NOWAIT ) is ‘‘false’’,
semop() incre-
ments the internal zero waiter count associated with the specified semaphore and suspends execu-
tion of the calling process until one of the following occurs:
Semaphore value becomes zero, at which time the value of internal zero waiter count 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
internal zero waiter count associated with the specified semaphore is decremented, and the
calling process resumes execution in the manner prescribed in signal(5).
semtimedop() is identical to semop() except that an additional constraint is provided by the timeout
parameter. If semtimedop() must suspend the calling process longer than the time indicated by
timeout, or if the timeout expires while the calling process is suspended in semtimedop() , the call
returns an error.
If the structure pointed to by the timeout parameter is zero-valued,
semtimedop() returns with an
error immediately if it would otherwise have to suspend the calling program.
If the timeout parameter is the NULL pointer, semtimedop() behaves exactly like semop().
EXAMPLES
The following call to
semop() atomically performs a "P" or "get" operation on the second semaphore in
the semaphore set and a "V" or "release" operation on the third semaphore in the set. This example
assumes the process has a valid semid which represents a set of 4 semaphores as shown on the semget (2)
manual page. It also assumes that the semaphore values of the semaphores in the set have been initialized
as shown in the semctl(2) manual entry.
struct sembuf sops[4];
sops[0].sem_num = 1;
sops[0].sem_op = -1; /* P (get) */
sops[0].sem_flg = 0;
sops[1].sem_num = 2;
sops[1].sem_op = 1; /* V (release) */
sops[1].sem_flg = 0;
semop (mysemid, sops, 2);
RETURN VALUE
If semop() or semtimedop() 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 non-negative value is returned. Otherwise, a value of −1 is returned and
errno is set to indicate the error.
ERRORS
semop() fails if one or more of the following is true for any of the semaphore operations specified by sops:
[EINVAL] semid is not a valid semaphore identifier.
[EFBIG] sem_num 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 (see glossary(9)).
[EAGAIN] The operation would result in suspension of the calling process but (sem_flg &
IPC_NOWAIT ) is "true".
374 Hewlett-Packard Company − 2 − HP-UX 11i Version 3: February 2007