summaryrefslogtreecommitdiffstats
path: root/man3p/semop.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/semop.3p')
-rw-r--r--man3p/semop.3p348
1 files changed, 348 insertions, 0 deletions
diff --git a/man3p/semop.3p b/man3p/semop.3p
new file mode 100644
index 000000000..dafdffe52
--- /dev/null
+++ b/man3p/semop.3p
@@ -0,0 +1,348 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "SEMOP" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" semop
+.SH NAME
+semop \- XSI semaphore operations
+.SH SYNOPSIS
+.LP
+\fB#include <sys/sem.h>
+.br
+.sp
+int semop(int\fP \fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB,
+size_t\fP \fInsops\fP\fB); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIsemop\fP() function operates on XSI semaphores (see the Base
+Definitions volume of IEEE\ Std\ 1003.1-2001, Section 4.15, Semaphore).
+It is unspecified whether this function interoperates
+with the realtime interprocess communication facilities defined in
+\fIRealtime\fP .
+.LP
+The \fIsemop\fP() function shall perform atomically a user-defined
+array of semaphore operations on the set of semaphores
+associated with the semaphore identifier specified by the argument
+\fIsemid\fP.
+.LP
+The argument \fIsops\fP is a pointer to a user-defined array of semaphore
+operation structures. The implementation shall not
+modify elements of this array unless the application uses implementation-defined
+extensions.
+.LP
+The argument \fInsops\fP is the number of such structures in the array.
+.LP
+Each structure, \fBsembuf\fP, includes the following members:
+.TS C
+center; l2 l2 l.
+\fBMember Type\fP \fBMember Name\fP \fBDescription\fP
+\fBshort\fP \fIsem_num\fP Semaphore number.
+\fBshort\fP \fIsem_op\fP Semaphore operation.
+\fBshort\fP \fIsem_flg\fP Operation flags.
+.TE
+.LP
+Each semaphore operation specified by \fIsem_op\fP is performed on
+the corresponding semaphore specified by \fIsemid\fP and
+\fIsem_num\fP.
+.LP
+The variable \fIsem_op\fP specifies one of three semaphore operations:
+.IP " 1." 4
+If \fIsem_op\fP is a negative integer and the calling process has
+alter permission, one of the following shall occur:
+.RS
+.IP " *" 3
+If \fIsemval\fP(see \fI<sys/sem.h>\fP) is greater than or equal to
+the absolute
+value of \fIsem_op\fP, the absolute value of \fIsem_op\fP is subtracted
+from \fIsemval\fP. Also, if (\fIsem_flg\fP
+&SEM_UNDO) is non-zero, the absolute value of \fIsem_op\fP shall be
+added to the calling process' \fIsemadj\fP value for the
+specified semaphore.
+.LP
+.IP " *" 3
+If \fIsemval\fP is less than the absolute value of \fIsem_op\fP and
+(\fIsem_flg\fP &IPC_NOWAIT) is non-zero,
+\fIsemop\fP() shall return immediately.
+.LP
+.IP " *" 3
+If \fIsemval\fP is less than the absolute value of \fIsem_op\fP and
+(\fIsem_flg\fP &IPC_NOWAIT) is 0, \fIsemop\fP()
+shall increment the \fIsemncnt\fP associated with the specified semaphore
+and suspend execution of the calling thread until one of
+the following conditions occurs:
+.RS
+.IP " *" 3
+The value of \fIsemval\fP becomes greater than or equal to the absolute
+value of \fIsem_op\fP. When this occurs, the value of
+\fIsemncnt\fP associated with the specified semaphore shall be decremented,
+the absolute value of \fIsem_op\fP shall be
+subtracted from \fIsemval\fP and, if (\fIsem_flg\fP &SEM_UNDO) is
+non-zero, the absolute value of \fIsem_op\fP shall be
+added to the calling process' \fIsemadj\fP value for the specified
+semaphore.
+.LP
+.IP " *" 3
+The \fIsemid\fP for which the calling thread is awaiting action is
+removed from the system. When this occurs, \fIerrno\fP
+shall be set equal to [EIDRM] and -1 shall be returned.
+.LP
+.IP " *" 3
+The calling thread receives a signal that is to be caught. When this
+occurs, the value of \fIsemncnt\fP associated with the
+specified semaphore shall be decremented, and the calling thread shall
+resume execution in the manner prescribed in \fIsigaction\fP() .
+.LP
+.RE
+.LP
+.RE
+.LP
+.IP " 2." 4
+If \fIsem_op\fP is a positive integer and the calling process has
+alter permission, the value of \fIsem_op\fP shall be added
+to \fIsemval\fP and, if (\fIsem_flg\fP &SEM_UNDO) is non-zero, the
+value of \fIsem_op\fP shall be subtracted from the
+calling process' \fIsemadj\fP value for the specified semaphore.
+.LP
+.IP " 3." 4
+If \fIsem_op\fP is 0 and the calling process has read permission,
+one of the following shall occur:
+.RS
+.IP " *" 3
+If \fIsemval\fP is 0, \fIsemop\fP() shall return immediately.
+.LP
+.IP " *" 3
+If \fIsemval\fP is non-zero and (\fIsem_flg\fP &IPC_NOWAIT) is non-zero,
+\fIsemop\fP() shall return immediately.
+.LP
+.IP " *" 3
+If \fIsemval\fP is non-zero and (\fIsem_flg\fP &IPC_NOWAIT) is 0,
+\fIsemop\fP() shall increment the \fIsemzcnt\fP
+associated with the specified semaphore and suspend execution of the
+calling thread until one of the following occurs:
+.RS
+.IP " *" 3
+The value of \fIsemval\fP becomes 0, at which time the value of \fIsemzcnt\fP
+associated with the specified semaphore shall be
+decremented.
+.LP
+.IP " *" 3
+The \fIsemid\fP for which the calling thread is awaiting action is
+removed from the system. When this occurs, \fIerrno\fP
+shall be set equal to [EIDRM] and -1 shall be returned.
+.LP
+.IP " *" 3
+The calling thread receives a signal that is to be caught. When this
+occurs, the value of \fIsemzcnt\fP associated with the
+specified semaphore shall be decremented, and the calling thread shall
+resume execution in the manner prescribed in \fIsigaction\fP() .
+.LP
+.RE
+.LP
+.RE
+.LP
+.LP
+Upon successful completion, the value of \fIsempid\fP for each semaphore
+specified in the array pointed to by \fIsops\fP shall
+be set equal to the process ID of the calling process.
+.SH RETURN VALUE
+.LP
+Upon successful completion, \fIsemop\fP() shall return 0; otherwise,
+it shall return -1 and set \fIerrno\fP to indicate the
+error.
+.SH ERRORS
+.LP
+The \fIsemop\fP() function shall fail if:
+.TP 7
+.B E2BIG
+The value of \fInsops\fP is greater than the system-imposed maximum.
+.TP 7
+.B EACCES
+Operation permission is denied to the calling process; see \fIXSI
+Interprocess
+Communication\fP .
+.TP 7
+.B EAGAIN
+The operation would result in suspension of the calling process but
+(\fIsem_flg\fP &IPC_NOWAIT) is non-zero.
+.TP 7
+.B EFBIG
+The value of \fIsem_num\fP is less than 0 or greater than or equal
+to the number of semaphores in the set associated with
+\fIsemid\fP.
+.TP 7
+.B EIDRM
+The semaphore identifier \fIsemid\fP is removed from the system.
+.TP 7
+.B EINTR
+The \fIsemop\fP() function was interrupted by a signal.
+.TP 7
+.B EINVAL
+The value of \fIsemid\fP is not a valid semaphore identifier, or the
+number of individual semaphores for which the calling
+process requests a SEM_UNDO would exceed the system-imposed limit.
+.TP 7
+.B ENOSPC
+The limit on the number of individual processes requesting a SEM_UNDO
+would be exceeded.
+.TP 7
+.B ERANGE
+An operation would cause a \fIsemval\fP to overflow the system-imposed
+limit, or an operation would cause a \fIsemadj\fP
+value to overflow the system-imposed limit.
+.sp
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.SS Setting Values in Semaphores
+.LP
+The following example sets the values of the two semaphores associated
+with the \fIsemid\fP identifier to the values contained
+in the \fIsb\fP array.
+.sp
+.RS
+.nf
+
+\fB#include <sys/sem.h>
+\&...
+int semid;
+struct sembuf sb[2];
+int nsops = 2;
+int result;
+.sp
+
+/* Adjust value of semaphore in the semaphore array semid. */
+sb[0].sem_num = 0;
+sb[0].sem_op = -1;
+sb[0].sem_flg = SEM_UNDO | IPC_NOWAIT;
+sb[1].sem_num = 1;
+sb[1].sem_op = 1;
+sb[1].sem_flg = 0;
+.sp
+
+result = semop(semid, sb, nsops);
+\fP
+.fi
+.RE
+.SS Creating a Semaphore Identifier
+.LP
+The following example gets a unique semaphore key using the \fIftok\fP()
+function, then
+gets a semaphore ID associated with that key using the \fIsemget\fP()
+function (the first
+call also tests to make sure the semaphore exists). If the semaphore
+does not exist, the program creates it, as shown by the second
+call to \fIsemget\fP(). In creating the semaphore for the queuing
+process, the program
+attempts to create one semaphore with read/write permission for all.
+It also uses the IPC_EXCL flag, which forces \fIsemget\fP() to fail
+if the semaphore already exists.
+.LP
+After creating the semaphore, the program uses a call to \fIsemop\fP()
+to initialize it to the values in the \fIsbuf\fP array.
+The number of processes that can execute concurrently without queuing
+is initially set to 2. The final call to \fIsemget\fP() creates a
+semaphore identifier that can be used later in the program.
+.LP
+The final call to \fIsemop\fP() acquires the semaphore and waits until
+it is free; the SEM_UNDO option releases the semaphore
+when the process exits, waiting until there are less than two processes
+running concurrently.
+.sp
+.RS
+.nf
+
+\fB#include <sys/types.h>
+#include <stdio.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <fcntl.h>
+#include <limits.h>
+\&...
+key_t semkey;
+int semid, pfd, fv;
+struct sembuf sbuf;
+char *lgn;
+char filename[PATH_MAX+1];
+struct stat outstat;
+struct passwd *pw;
+\&...
+/* Get unique key for semaphore. */
+if ((semkey = ftok("/tmp", 'a')) == (key_t) -1) {
+ perror("IPC error: ftok"); exit(1);
+}
+.sp
+
+/* Get semaphore ID associated with this key. */
+if ((semid = semget(semkey, 0, 0)) == -1) {
+.sp
+
+ /* Semaphore does not exist - Create. */
+ if ((semid = semget(semkey, 1, IPC_CREAT | IPC_EXCL | S_IRUSR |
+ S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) != -1)
+ {
+ /* Initialize the semaphore. */
+ sbuf.sem_num = 0;
+ sbuf.sem_op = 2; /* This is the number of runs without queuing. */
+ sbuf.sem_flg = 0;
+ if (semop(semid, &sbuf, 1) == -1) {
+ perror("IPC error: semop"); exit(1);
+ }
+ }
+ else if (errno == EEXIST) {
+ if ((semid = semget(semkey, 0, 0)) == -1) {
+ perror("IPC error 1: semget"); exit(1);
+ }
+ }
+ else {
+ perror("IPC error 2: semget"); exit(1);
+ }
+}
+\&...
+sbuf.sem_num = 0;
+sbuf.sem_op = -1;
+sbuf.sem_flg = SEM_UNDO;
+if (semop(semid, &sbuf, 1) == -1) {
+ perror("IPC Error: semop"); exit(1);
+}
+\fP
+.fi
+.RE
+.SH APPLICATION USAGE
+.LP
+The POSIX Realtime Extension defines alternative interfaces for interprocess
+communication. Application developers who need to
+use IPC should design their applications so that modules using the
+IPC routines described in \fIXSI Interprocess Communication\fP can
+be easily modified to use the alternative
+interfaces.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIXSI Interprocess Communication\fP , \fIRealtime\fP , \fIexec\fP()
+,
+\fIexit\fP() , \fIfork\fP() , \fIsemctl\fP() , \fIsemget\fP() , \fIsem_close\fP()
+, \fIsem_destroy\fP() , \fIsem_getvalue\fP() , \fIsem_init\fP() ,
+\fIsem_open\fP() , \fIsem_post\fP() , \fIsem_unlink\fP() , \fIsem_wait\fP()
+, the Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<sys/ipc.h>\fP,
+\fI<sys/sem.h>\fP, \fI<sys/types.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .