semop(S)
semop --
semaphore operations
Synopsis
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf sops, size_t nsops);
Description
semop
is used to perform atomically 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
sem_op
is performed on the corresponding semaphore specified by
semid
and
sem_num.
sem_op
specifies one of three semaphore operations as follows,
depending on whether its value is negative, positive, or zero:
If
sem_op
is a negative integer, one of the following occurs:
{ALTER}
-
If semval
[see
intro(S)]
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 true, the absolute value of
sem_op
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
sem_op
and
(sem_flg&IPC_NOWAIT) is true, semop
returns immediately.
-
If semval is less than the absolute value of
sem_op
and (sem_flg&IPC_NOWAIT)
is false, semop
increments the semncnt associated with the specified semaphore
and suspends execution of the calling process
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 true, the absolute value of
sem_op
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
signal(M).
If sem_op is a positive integer, the value of
sem_op is added to semval
and, if (sem_flg&SEM_UNDO)
is true, the value of sem_op
is subtracted from the calling process's semadj value for the specified
semaphore.
{ALTER}
If sem_op 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).
Return values
On success, semop returns 0, and 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.
On failure, semop returns -1 and sets errno to identify the error.
Errors
In the following conditions, semop fails and sets errno to:
EINTR-
semop returned due to receipt of a signal.
EIDRM-
semop returned due to the removal of
semid
from the system.
EFBIG-
sem_num
is less than zero or greater than or equal to the number of semaphores
in the set associated with semid.
The signal SIGXFSZ is always generated by this error condition.
E2BIG-
nsops
is greater than the system-imposed maximum.
EACCES-
Operation permission is denied to the calling process
[see
intro(S)].
EAGAIN-
The operation would result in suspension of the calling process but
(sem_flg&IPC_NOWAIT) is true.
ENOSPC-
The limit on the number of individual processes requesting an
SEM_UNDO would be exceeded.
EINVAL-
semid
is not a valid semaphore identifier.
EINVAL-
The number of individual semaphores for which the calling process
requests a
SEM_UNDO
would exceed the limit.
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.
EFAULT-
sops
points to an illegal address.
References
exec(S),
exit(S),
fork(S),
intro(S),
semctl(S),
semget(S)
Notices
Considerations for threads programming
While one thread is blocked, siblings might still be executing.
The Threads Library provides two other semaphore facilities for
the synchronization of multithreaded programs.
See
Intro(PTHREAD)
and
semaphore(SYNCH)
for details.
Both facilities can also be used for synchronization between processes.
© 2005 The SCO Group, Inc. All rights reserved.
SCO OpenServer Release 6.0.0 - 01 June 2005