SYNOPSIS
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);
DESCRIPTION
The
short sem_num; /* semaphore number */ short sem_op; /* semaphore operation. */ short sem_flg; /* operation flags */
Each semaphore operation specified by sem_op is performed on the corresponding semaphore identified by semid and sem_num. The variable sem_op specifies one of three semaphore operations as follows, depending upon whether its value is negative, positive, or zero.
If sem_op is a negative integer and the calling process has alter permission, one of the following occurs.
- If semval is greater than or equal to the absolute value of sem_op, the absolute value of sem_op is subtracted from semval. Also, if (sem_flg & SEM_UNDO) is non-zero, the absolute value of sem_op is added to the semadj value of the calling process for the specified semaphore.
- If semval is less than the absolute value
of sem_op and
(sem_flg & IPC_NOWAIT) is non-zero,
semop() returns immediately. - If semval is less than the absolute value
of sem_op and
(sem_flg & IPC_NOWAIT) is zero,
sem_op increments the semncnt associated with the
specified semaphore and suspends execution of the calling thread
until one of the following conditions occur:
- semval becomes greater than or equal to the absolute value of sem_op. When this occurs, the value of semncnt associated with the specified semaphore is decremented; the absolute value of sem_op is subtracted from semval; and, if (sem_flg & SEM_UNDO) is non-zero, the absolute value of sem_op is added to the semadj value of the calling process for the specified semaphore.
- The semid
for which the calling process is awaiting action
is removed from the system. When this occurs,
semop() sets errno equal to EIDRM and returns a value of -1. - The calling process receives a signal that is to be caught. When this occurs, the value of semncnt associated with the specified semaphore is decremented, and the calling process resumes execution in the manner prescribed in signal.
If sem_op is a positive integer and the calling process has alter permission, the value of sem_op is added to semval; and, if (sem_flg & SEM_UNDO) is non-zero, the value of sem_op is subtracted from the semadj value of the calling process for the specified semaphore.
If sem_op is zero and the calling process has read permission, one of the following occurs:
- If semval is zero,
semop() returns immediately. - If semval is non-zero and
(sem_flg & IPC_NOWAIT) is non-zero,
semop() returns immediately. - If semval is non-zero and
(sem_flg & IPC_NOWAIT) is zero,
semop() increments the semzcnt associated with the specified semaphore and suspends execution of the calling thread until one of the following occurs:- semval becomes zero, at which time the value of semzcnt associated with the specified semaphore is decremented.
- The semid for which the calling process is awaiting action is removed from the system. When this occurs, errno is set equal to EIDRM, and a value of -1 is returned.
- The calling process receives a signal that is to be caught.
When this occurs, the value of semzcnt associated with the
specified semaphore is decremented, and the
calling process resumes execution in the manner
prescribed in
sigaction() .
When
PARAMETERS
- semid
-
Is a unique positive integer created by a
semget() call. - sops
-
Points to the array of semaphore-operation structures.
- nsops
-
Is the number of semaphore-operation structures in sops.
RETURN VALUES
If successful,
- E2BIG
-
nsops is greater than the system-imposed maximum.
- EACCES
-
Operation permission is denied to the calling process.
- EAGAIN
-
The operation would result in suspension of the calling process but (sem_flg & IPC_NOWAIT) is non-zero.
- EFAULT
-
sops points to an illegal address.
- EFBIG
-
sem_num is less than zero or greater than or equal to the number of semaphores in the set associated with semid.
- EIDRM
-
A semid was removed from the system.
- EINTR
-
A signal interrupted the call.
- EINVAL
-
semid is not a valid semaphore identifier.
The number of individual semaphores for which the calling process requests a SEM_UNDO would exceed the limit.
- ENOSPC
-
The limit on the number of individual processes requesting a SEM_UNDO would be exceeded.
- ERANGE
-
An operation would cause a semadj value to overflow the system-imposed limit.
An operation would cause a semval to overflow the system-imposed limit.
CONFORMANCE
UNIX 98
MULTITHREAD SAFETY LEVEL
MT-Safe.
PORTING ISSUES
NuTCRACKER Platform semaphores are not implemented in terms of Win32 semaphores; therefore, they cannot be shared with Win32 applications.
AVAILABILITY
PTC MKS Toolkit for Professional Developers
PTC MKS Toolkit for Professional Developers 64-Bit Edition
PTC MKS Toolkit for Enterprise Developers
PTC MKS Toolkit for Enterprise Developers 64-Bit Edition
SEE ALSO
- Functions:
semctl() ,semget() ,sigaction()
PTC MKS Toolkit 10.4 Documentation Build 39.