semop(2) semop(2)
NAME
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(2)] 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(2)] 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.
Copyright 1994 Novell, Inc. Page 1
semop(2) semop(2)
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(2)]. 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(5).
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.
Copyright 1994 Novell, Inc. Page 2
semop(2) semop(2)
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(2).
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. In this instance, the
signal SIGXFSZ will not be generated. However,
if file sizes are too big, the signal SIGXFSZ
will be generated.
E2BIG nsops is greater than the system-imposed
maximum.
EACCES Operation permission is denied to the calling
process [see intro(2)].
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.
Copyright 1994 Novell, Inc. Page 3
semop(2) semop(2)
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(2), exit(2), fork(2), intro(2), semctl(2), semget(2)
NOTICES
Considerations for Threads Programming
While one thread is blocked, siblings might still be
executing.
The Threads Library provides another semaphore facility for
the synchronization of multithreaded programs. See
semaphore(3synch). That facility can also be used for
synchronization between processes. See discussion of the
USYNC_PROCESS flag.
Copyright 1994 Novell, Inc. Page 4