semop(S)
semop --
semaphore operations
Syntax
cc . . . -lc
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop (semid, sops, nsops)
int semid;
struct sembuf *sops;
unsigned nsops;
Description
The semop system call
is used to automatically perform an array of semaphore operations on the
set of semaphores associated with the semaphore identifier specified by
semid.
sops
is a pointer to the array of semaphore-operation structures.
nsops is the number of such structures in the array.
The contents of each structure includes the following members:
short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
Each semaphore operation specified by semop
is performed on the corresponding semaphore specified by
semid and sem_num
.
semop specifies one of three semaphore operations as follows:
-
If semop
is a negative integer, one of the following occurs:
{ALTER}
-
If semval is greater than or equal to the absolute value of
semop, the absolute value of semop
is subtracted from semval.
Also, if (
sem_flg
& SEM_UNDO)
is ``true'', the absolute value of semop
is added to the calling process's semadj value (see
exit(S))
for the specified semaphore.
-
If semval is less than the absolute value of semop
and (
sem_flg
& IPC_NOWAIT) is ``true'',
semop returns immediately.
If semval is less than the absolute value of semop
and (sem_flg
& IPC_NOWAIT)
is ``false'', semop
increments the semncnt associated with the specified semaphore
and suspend execution of the calling process
until one of the following conditions occurs:
-
Semval becomes greater than or equal to the absolute value of
semop.
When this occurs, the value of semncnt associated with the specified
semaphore is decremented, the absolute value of semop
is subtracted from semval and, if (
sem_flg
& SEM_UNDO)
is ``true'', the absolute value of semop
is added to the calling process's semadj value for the specified semaphore.
-
The semid for which the calling process is awaiting action
is removed from the system (see
semctl(S)).
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 semncnt associated with the specified
semaphore is decremented,
and the calling process resumes execution in the manner prescribed in
LR sigaction S .
-
If semop is a positive integer, the value of
semop is added to semval and, if
(
sem_flg
& SEM_UNDO) is ``true'', the value of
semop
is subtracted from the calling process's semadj value for the specified
semaphore.
{ALTER}
-
If semop is zero, one of the following occurs:
{READ}
-
If semval is zero, semop returns immediately.
-
If semval is not equal to zero and (
sem_flg
&
IPC_NOWAIT) is ``true'', semop
returns immediately.
-
If semval is not equal to zero and (
sem_flg
&
IPC_NOWAIT) is ``false'', semop
increments the semzcnt associated with the specified semaphore
and suspends execution of the calling process 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
signal(S).
The semop system call
fails if one or more of the following is true for any of the semaphore
operations specified by sops:
[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 ``true''.
[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.
[EINVAL]-
semid is not a valid semaphore identifier.
[EINVAL]-
The number of individual semaphores for which the calling process
requests an SEM_UNDO would exceed the limit.
[ENOSPC]-
The limit on the number of individual processes requesting an
SEM_UNDO would be exceeded.
[ERANGE]-
An operation would cause a semval to overflow the system-imposed limit.
[ERANGE]-
An operation would cause a semadj value to overflow the
system-imposed limit.
Upon successful completion, the value of sempid
for each semaphore specified in the array pointed to by
sops is set equal to the process
ID of the calling process.
Diagnostics
If semop
returns due to the receipt of a signal, a value of -1 is returned to the
calling process and errno is set to EINTR.
If it returns due to the removal of a semid
from the system, a value of -1 is returned and
errno is set to EIDRM.
Upon successful completion, a value of zero
is returned.
Otherwise, a value of -1 is returned and
errno is set to indicate the error.
See also
exec(S),
exit(S),
fork(S),
semctl(S),
semget(S)
Standards conformance
semop is conformant with:
X/Open Portability Guide, Issue 3, 1989
.
© 2003 Caldera International, Inc. All rights reserved.
SCO OpenServer Release 5.0.7 -- 11 February 2003