semop(2) performs operations on a semaphore set. The semid argument is the semaphore ID returned by a previous semget() call. The sops argument is a pointer to an array of structures, each containing the following information about a semaphore operation:
The semaphore number
The operation to be performed
Control flags, if any
The sembuf structure specifies a semaphore operation, as defined in <sys/sem.h>.The nsops argument specifies the length of the array, the maximum size of which is determined by the SEMOPM configuration option; this is the maximum number of operations allowed by a single semop(2) call, and is set to 10 by default.
The operation to be performed is determined as follows:
A positive integer increments the semaphore value by that amount.
A negative integer decrements the semaphore value by that amount. An attempt to set a semaphore to a value less than zero fails or blocks, depending on whether IPC_NOWAIT is in effect.
A value of zero means to wait for the semaphore value to reach zero.
There are two control flags that can be used with semop(2).
|
IPC_NOWAIT |
Can be set for any operations in the array. Makes the function return without changing any semaphore value if any operation for which IPC_NOWAIT is set cannot be performed. The function fails if it tries to decrement a semaphore more than its current value, or tests a nonzero semaphore to be equal to zero. |
|
SEM_UNDO |
Allows individual operations in the array to be undone when the process exits. |
The following code illustrates the semop(2) function.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
...
int i; /* work area */
int nsops; /* number of operations to do */
int semid; /* semid of semaphore set */
struct sembuf *sops; /* ptr to operations to perform */
...
if ((i = semop(semid, sops, nsops)) == -1) {
perror("semop: semop failed");
} else
(void) fprintf(stderr, "semop: returned %d\n", i);
...