The
semop ();
system call
atomically performs the array of operations indicated by
Fa array
on the semaphore set indicated by
Fa semid .
The length of
Fa array
is indicated by
Fa nops .
Each operation is encoded in a
Vt struct sembuf ,
which is defined as follows:
For each element in
Fa array ,
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
OR '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
When
sem_op
is positive and the process has alter permission,
the semaphore's value is incremented by
sem_op 's
value.
If
SEM_UNDO
is specified, the semaphore's adjust on exit value is decremented by
sem_op 's
value.
A positive value for
sem_op
generally corresponds to a process releasing a resource
associated with the semaphore.
The behavior when
sem_op
is negative and the process has alter permission,
depends on the current value of the semaphore:
If the current value of the semaphore is greater than or equal to
the absolute value of
sem_op
then the value is decremented by the absolute value of
sem_op
If
SEM_UNDO
is specified, the semaphore's adjust on exit
value is incremented by the absolute value of
sem_op
If the current value of the semaphore is less than the absolute value of
sem_op
one of the following happens:
If
IPC_NOWAIT
was specified, then
semop ();
returns immediately with a return value of
Er EAGAIN .
Otherwise, the calling process is put to sleep until one of the following
conditions is satisfied:
Some other process removes the semaphore with the
IPC_RMID
option of
semctl(2).
In this case,
semop ();
returns immediately with a return value of
Er EIDRM .
The process receives a signal that is to be caught.
In this case, the process will resume execution as defined by
sigaction(2).
The semaphore's
value is greater than or equal to the absolute value of
sem_op
When this condition becomes true, the semaphore's value is decremented
by the absolute value of
sem_op
the semaphore's adjust on exit value is incremented by the
absolute value of
sem_op
A negative value for
sem_op
generally means that a process is waiting for a resource to become
available.
When
sem_op
is zero and the process has read permission,
one of the following will occur:
If the current value of the semaphore is equal to zero
then
semop ();
can return immediately.
If
IPC_NOWAIT
was specified, then
semop ();
returns immediately with a return value of
Er EAGAIN .
Otherwise, the calling process is put to sleep until one of the following
conditions is satisfied:
Some other process removes the semaphore with the
IPC_RMID
option of
semctl(2).
In this case,
semop ();
returns immediately with a return value of
Er EIDRM .
The process receives a signal that is to be caught.
In this case, the process will resume execution as defined by
sigaction(2).
The semaphore's value becomes zero.
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.
RETURN VALUES
Rv -std semop
ERRORS
The
semop ();
system call will fail if:
Bq Er EINVAL
No semaphore set corresponds to
Fa semid ,
or the process would exceed the system-defined limit for the number of
per-process
SEM_UNDO
structures.
Bq Er EACCES
Permission denied due to mismatch between operation and mode of
semaphore set.
Bq Er EAGAIN
The semaphore's value would have resulted in the process being put to sleep
and
IPC_NOWAIT
was specified.
Bq Er E2BIG
Too many operations were specified.
Bq Dv SEMOPM
Bq Er EFBIG
sem_num
was not in the range of valid semaphores for the set.
Bq Er EIDRM
The semaphore set was removed from the system.
Bq Er EINTR
The
semop ();
system call was interrupted by a signal.
Bq Er ENOSPC
The system
SEM_UNDO
pool
Bq Dv SEMMNU
is full.
Bq Er ERANGE
The requested operation would cause either
the semaphore's current value
Bq Dv SEMVMX
or its adjust on exit value
Bq Dv SEMAEM
to exceed the system-imposed limits.