COHERENT manpages
This page displays the COHERENT manpage for semop() [Perform semaphore operations].
List of available manpages
Index
semop() -- General Function (libc)
Perform semaphore operations
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(id, operation, nops)
int id, nops; struct sembuf operation[];
semop() performs semaphore operations.
id identifies the set of semaphores to be manipulated. It must have been
returned by a call to semget().
nops gives the number of structures in the array pointed to by operation.
operation points to an array of structures of type sembuf, which the header
file sem.h defines as follows:
struct sembuf {
unsigned short sem_num; /* semaphore # */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
Each sembuf describes a semaphore operation. Field sem_op identifies the
operation to perform on the semaphore in the set identified by id and with
offset sem_num. sem_op specifies one of three semaphore operations, as
follows:
1. If sem_op is negative, one of the following occurs:
A. If semval in the semaphore structure identified by id is greater than
or equal to the absolute value of sem_op, semop() subtracts the
absolute value of sem_op from semval.
B. If semval is less than the absolute value of sem_op and (sem_flg
& IPC_NOWAIT) is true, semop() sets errno to EGAIN and
immediately returns -1.
C. If semval is less than the absolute value of sem_op and (sem_flg
& IPC_NOWAIT) is false, then semop() increments the semncnt
associated with the specified semaphore and suspends execution of the
calling process until one of the following occurs:
a. semval equals or exceeds the absolute value of sem_op. When this
occurs, semop() decrements the value of semncnt associated with
the specified semaphore, and subtracts the absolute value of
sem_op from semval.
b. The id for which the calling process is awaiting action is removed
from the system.
c. The calling process receives a signal. When this occurs, semop()
decrements the field semncnt in the sem structure that id
identifies, and the calling process resumes execution in the
manner defined by the signal. (See the Lexicon entry for signal()
for details of what behavior each signal initiates.)
2. If sem_op is positive, semop() adds sem_op to semval.
3. If sem_op is zero, one of the following occurs:
A. If semval is zero, semop() returns immediately.
B. If semval does not equal zero and (sem_flg & IPC_NOWAIT) is true,
semop() sets errno to EGAIN, and immediately returns -1.
C. If semval does not equal zero and (sem_flg & IPC_NOWAIT) is
false, semop() increments the semzcnt associated with the specified
semaphore and suspends execution of the calling process until one of
the following occurs:
a. semval becomes zero. semop() decrements the value of the field
semzcnt associated with the specified semaphore.
b. The set of semaphores identified by id is removed from the system.
c. The calling process receives a signal. semop() then decrements
the value of the semzcnt associated with the specified semaphore,
and the calling process resumes execution in the manner prescribed
by the signal.
If field sem_flg in a sembuf structure contains value SEM_UNDO (i.e.,
expression (sem_flg & SEM_UNDO) is true) then the system stores an
adjust value for this semaphore operation for this semaphore and links it
to the process that has invoked semop(). The adjust value is the inversion
of this semaphore operation; when the process dies, the system executes
these adjust values, to undo each of these semaphore operations. If you
use the function semctl() to change the value of a semaphore or a set of
semaphores, then the system erases all adjust values for those semaphores.
semop() returns -1 and sets errno to the value in parentheses if any of the
following error conditions occurs:
-> id is not a valid semaphore identifier (EINVAL).
-> sem_num is less than zero or greater than or equal to the number of
semaphores in the set associated with id (EFBIG).
-> nops exceeds the system-imposed maximum (E2BIG).
-> Permission is denied to the calling process (EACCES).
-> operation would suspend the calling process but (sem_flg &
IPC_NOWAIT) is true (EAGAIN).
-> operation would cause semval to overflow the system-imposed limit
(ERANGE).
-> operation points to an illegal address (EFAULT).
-> The calling processing receives a signal (EINTR).
-> The set of semaphores identified by id has been removed from the system
(EDOM).
If all goes well, semop() sets the sempid of each semaphore specified in
the array pointed to by operation to the process identifier of the calling
process. It then returns the value that semval had had at the time that
the last operation in the array pointed to by operation was executed.
Files
/usr/include/sys/ipc.h
/usr/include/sys/sem.h
See Also
libc,
semctl(),
semget()
Notes
The COHERENT implementation of semaphores does not permit a process to lock
or unlock a semaphore unless it can gain access to all of the semaphores
that it requests. This is to prevent the situation in which two processes
have each locked semaphores that the other wants, and each has IPC_NOWAIT
set to false -- thus suspending each other forever.







