semop(2)semop(2)NAMEsemop - Perform semaphore operations
SYNOPSIS
#include <sys/sem.h>
int semop(
int semid,
struct sembuf *sops,
size_t nsops );
The following declaration of the nsops parameter does not conform to
current standards and is supported only for backward compatibility:
u_int nsops
Application developers may want to specify #include statements for
<sys/types.h> and <sys/ipc.h> before the one for <sys/sem.h> if pro‐
grams are being developed for multiple platforms. The additional
#include statements are not required on Tru64 UNIX systems or by ISO or
XSH specifications, but may be required on other vendors' systems that
conform to these standards.
STANDARDS
Interfaces documented on this reference page conform to industry stan‐
dards as follows:
semop(): XSH4.0, XSH4.2, XSH5.0
Refer to the standards(5) reference page for more information about
industry standards and associated tags.
PARAMETERS
Specifies the ID of the semaphore set. Points to the user-defined
array of sembuf structures that contain the semaphore operations. The
number of sembuf structures in the array.
DESCRIPTION
The semop() function performs operations on the semaphores in the spec‐
ified semaphore set. The semaphore operations are defined in the sops
array. The sops array contains nsops elements, each of which is repre‐
sented by a sembuf structure.
The sembuf structure (from <sys/sem.h>) is shown here:
struct sembuf {
u_short sem_num;
short sem_op;
short sem_flg; };
The fields in the sembuf structure are defined as follows: Specifies an
individual semaphore within the semaphore set. Specifies the operation
to perform on the semaphore. Specifies various options for the opera‐
tions. The possible values are: Instructs the kernel to adjust the
process's adjust-on-exit value for a modified semaphore. When the
process exits, the kernel uses this value to restore the semaphore to
the value it had before any modifications by the process. This option
is used to prevent semaphore locking by a process that no longer
exists. Instructs the kernel to return an error condition if a
requested operation would cause the process to sleep. If the kernel
returns an error condition, none of the requested semaphore operations
are performed.
The sem_op operation is specified as a negative integer, a positive
integer, or 0 (zero). The effects of these three values are described
below.
If sem_op is a negative integer and the calling process has modify per‐
mission, the semop() function does one of the following: If the sema‐
phore's current value (in semval) is equal to or greater than the abso‐
lute value of sem_op, the absolute value of sem_op is subtracted from
semval. If SEM_UNDO is set, the absolute value of sem_op is added to
the calling process' adjust-on-exit value for the semaphore. If semval
is less than the absolute value of sem_op and IPC_NOWAIT is set,
semop() returns immediately. If semval is less than the absolute value
of sem_op and IPC_NOWAIT is not set, semop() increments the semaphore's
semncnt value and suspends the calling process.
If the process is suspended, it sleeps until one of the following
occurs: The semval value becomes equal to or greater than the absolute
value of sem_op. In this case, the semaphore's semncnt value is decre‐
mented; the absolute value of sem_op is subtracted from semval; and, if
SEM_UNDO is set, the absolute value of sem_op is added to the calling
process's adjust-on-exit value for the semaphore. The semaphore set
(specified by semid) is removed from the system. In this case, errno is
set equal to [EIDRM] and a value of -1 is returned to the calling
process. The calling process catches a signal. In this case, the sema‐
phore's semncnt value is decremented, and the calling process resumes
execution as directed by the sigaction() function.
If sem_op is a positive integer and the calling process has modify per‐
mission, semop() adds the sem_op value to the semaphore's current sem‐
val value. If SEM_UNDO is set, the sem_op value is subtracted from the
calling process's adjust-on-exit value for the semaphore.
If sem_op is 0 (zero) and the calling process has read permission,
semop() does one of the following: If semval is 0, semop() returns
immediately. If semval is not equal to 0 and IPC_NOWAIT is set,
semop() returns immediately. If semval is not equal to 0 and
IPC_NOWAIT is not set, semop() increments the semaphore's semzcnt value
and suspends the calling process.
If the process is suspended, it sleeps until one of the following
occurs: The semval value becomes 0 (zero). In this case, the sema‐
phore's semncnt value is decremented. The semaphore set (specified by
semid) is removed from the system. In this case, errno is set equal to
[EIDRM] and a value of -1 is returned to the calling process. The
calling process catches a signal. In this case, the semaphore's semncnt
value is decremented, and the calling process resumes execution as
directed by the sigaction() function.
The calling process must have read (sense) or write (alter) permission
to the semaphore set for all access control policies for each specified
operation. If any operation accesses the semaphore set in a way that
is not allowed according to one of the access control policies, access
is denied.
NOTES
[Tru64 UNIX] Semaphore operations are performed atomically; that is,
either all of the requested operations are performed, or none are. If
the kernel goes to sleep while doing the operations, it restores all of
the semaphores in the set to their previous values, at the start of the
semop() function.
The librt library contains alternative interfaces for interprocess com‐
munication. The names of these routines adhere to the format sem_* and
their reference pages are listed in SEE ALSO.
RETURN VALUES
Upon successful completion, the semop() function returns a value of 0
(zero) and the sempid value for each semaphore that is operated upon is
set to the process ID of the calling process.
If the semop() function fails, a value of -1 is returned and errno is
set to indicate the error.
ERRORS
The semop() function sets errno to the specified values for the follow‐
ing conditions: The nsops parameter is greater than the system-defined
maximum. The calling process does not have the required permission.
The process does not have read or write access permission to the sema‐
phore set with respect to all access control policies. Both sem_flg
and IPC_NOWAIT are true, but the requested operation would cause the
calling process to be suspended. [Tru64 UNIX] Indicates that the
requested address is in some way invalid, for example, out of bounds.
The sem_num value is greater than or equal to the number of semaphores
in the set associated with semid. The semaphore ID specified by the
semid parameter has been removed from the system. The semop() function
was interrupted by a signal. One of the following conditions applies:
The semid value is not a valid semaphore ID. The number of semaphores
for which SEM_UNDO is requested exceeds the system-defined limit.
[Tru64 UNIX] The sem_num value is less than zero. The system-defined
limit on the number of processes using SEM_UNDO was exceeded. An oper‐
ation caused a semval value to overflow the system-defined limit, or an
operation caused an adjust-on-exit value to exceed the system-defined
limit. [Tru64 UNIX] The requested operation is not supported by this
implementation.
SEE ALSO
Functions: exec(2), exit(2), fork(2), semctl(2), semget(2),
sem_close(3), sem_destroy(3), sem_getvalue(3),
sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3)
Data Structures: semid_ds(4)
Standards: standards(5)semop(2)