SEMOP(2) System Calls Manual SEMOP(2)

semopatomic array of operations on a semaphore set

#include <sys/sem.h>

semop(int semid, struct sembuf *sops, size_t nsops);

The () system call atomically performs the array of operations indicated by sops on the semaphore set indicated by semid. The length of sops is indicated by nsops. Each operation is encoded in a struct sembuf, which is defined as follows:

struct sembuf {
        u_short sem_num;        /* semaphore # */
        short   sem_op;         /* semaphore operation */
        short   sem_flg;        /* operation flags */

For each element in sops, sem_op and sem_flg determine an operation to be performed on semaphore number sem_num in the set. The values SEM_UNDO and IPC_NOWAIT may be 'ed into the sem_flg member in order to modify the behavior of the given operation.

The operation performed depends as follows on the value of sem_op:

For each semaphore a process has in use, the kernel maintains an “adjust on exit” value, as alluded to earlier. When a process exits, either voluntarily or involuntarily, the adjust on exit value for each semaphore is added to the semaphore's value. This can be used to insure that a resource is released if a process terminates unexpectedly.

The semop() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

The semop() system call will fail if:

Too many operations are specified. [SEMOPM]
Permission is denied, due to a mismatch between the operation and the mode of the semaphore set.
The semaphore's value would result in the process being put to sleep and IPC_NOWAIT is specified.
sem_num is not in the range of valid semaphores for the set.
The semaphore set is removed from the system.
The semop() system call is interrupted by a signal.
No semaphore set corresponds to semid, or the process would exceed the system-defined limit for the number of per-process SEM_UNDO structures.
The system SEM_UNDO pool [SEMMNU] is full.
The requested operation would cause either the semaphore's current value [SEMVMX] or its adjust-on-exit value [SEMAEM] to exceed the system-imposed limits.

#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>

The include files <sys/types.h> and <sys/ipc.h> are necessary.

semctl(2), semget(2), sigaction(2), compat(5)

The semop() system call may block waiting for memory even if IPC_NOWAIT was specified.

September 22, 1995 macOS 14.1