semop(2) performs operations on a semaphore set. The semid argument is the semaphore ID returned by a previous semget(2) 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:
Positive integer increments the semaphore value by that amount.
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.
Value of zero means to wait for the semaphore value to reach zero.
The two control flags that can be used with semop(2) are shown below:
|
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);
...