| SEMOP(2) | System Calls Manual | SEMOP(2) |
semop, semtimedop —
semaphore operations
Standard C Library (libc, -lc)
#include
<sys/sem.h>
int
semop(int
semid, struct sembuf
*sops, size_t
nsops);
int
semtimedop(int
semid, struct sembuf
*sops, size_t
nsops, struct timespec
*timeout);
semop()
provides a number of atomic operations on a set of semaphores. The semaphore
set is specified by semid, sops
is an array of semaphore operations, and nsops is the
number of operations in this array. The sembuf
structures in the array contain the following members:
unsigned short sem_num; /* semaphore # */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
Each operation (specified in sem_op) is applied to semaphore number sem_num in the set of semaphores specified by semid. The value of sem_op determines the action taken in the following way:
The behaviour of each operation is influenced by the flags set in sem_flg in the following way:
IPC_NOWAITIPC_NOWAIT
makes the call return immediately, returning a value of -1 and setting
errno to EAGAIN.semtimedop()
is similar to semop(), but it also allows specifying
a timeout. When the semaphore is not available, the thread typically sleeps
until the semaphore is available. semtimedop()
allows specifying a maximum amount of time in timeout
argument that a thread should sleep while waiting for the semaphore to be
available. If the specified time limit has been reached,
semtimedop() fails with
EAGAIN (and none of the operations in
sops are performed). If timeout
is NULL, semtimedop()
behaves exactly like semop().
Upon successful completion both semop()
and semtimedop() return a value of 0. Otherwise, -1
is returned and the global variable errno is set to
indicate the error.
semop() will fail if:
EINVAL]EIDRM]EACCES]E2BIG]MAX_SOPS in
<sys/sem.h>.EFBIG]ENOSPC]SEM_UNDO
was requested, and there is not enough space left in the kernel to store
the undo information.EAGAIN]IPC_NOWAIT was set in
sem_flg.EFAULT]EINTR]In addition, semtimedop() will fail
if:
The following example shows how to perform a semaphore operation with a timeout:
/* Performs a semaphore operation with a 5 sec timeout*/
struct sembuf sops[1]; /* Semaphore operation structure */
struct timespec timeout; /* Timeout structure */
/* Create semaphore set with 1 semaphore */
int semid = semget(key, 1, 0666 | IPC_CREAT);
/* Initialize semaphore to 0 */
if (semctl(semid, 0, SETVAL, 0) == -1) {
warn("semctl SETVAL");
exit(EXIT_FAILURE);
}
sops[0].sem_num = 0; /* Operation on semaphore 0 */
sops[0].sem_op = -1; /* Decrement semaphore by 1 */
sops[0].sem_flg = 0; /* No flags */
timeout.tv_sec = 5; /* 5 seconds */
timeout.tv_nsec = 0; /* 0 nanoseconds */
if (semtimedop(semid, sops, 1, &timeout) == -1) {
warn("semtimedop"); /* Print error message */
}
The semop, semtimedop system call conforms
to X/Open System Interfaces and Headers Issue 5
(“XSH5”).
Semaphores appeared in the first release of AT&T System V UNIX.
| October 3, 2024 | NetBSD 11.0 |