|
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:
| If
| sem_op
is a negative integer, one of the following will occur:
[ALTER]
(see
semctl(2)) |
|
| 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_UNDOS)
is ``true'', the absolute value of
sem_op()
is added to the calling process's
semadj
value (see
exit(2V))
for the specified semaphore.
|
|
| If
semval
is less than the absolute value of
sem_op()
and
IPC_NOWAITS)
is ``true'',
semop()
will return immediately.
|
|
| If
semval
is less than the absolute value of
sem_op()
and
IPC_NOWAITS)
is ``false'',
semop()
will increment the
semncnt
associated with the specified semaphore
and suspend 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_UNDOS)
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
EIDRMS,
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(3V). |
If
sem_op()
is a positive integer, the value of
sem_op()
is added to
semval and, if
SEM_UNDOS) 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 will occur:
[READ]
-
- If
semval is zero,
semop()
will return immediately.
-
- If
semval is not equal to zero and
IPC_NOWAITS) is ``true'',
semop()
will return immediately.
-
- If
semval is not equal to zero and
IPC_NOWAITS) is ``false'',
semop()
will increment the
semzcnt associated with the specified semaphore
and suspend 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
EIDRMS,
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(3V). |
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.
|