]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man3/sem_wait.3
fuse.4: ffix
[thirdparty/man-pages.git] / man3 / sem_wait.3
CommitLineData
2c731798 1'\" t
c11b1abf 2.\" Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
2c731798 3.\"
93015253 4.\" %%%LICENSE_START(VERBATIM)
2c731798
MK
5.\" Permission is granted to make and distribute verbatim copies of this
6.\" manual provided the copyright notice and this permission notice are
7.\" preserved on all copies.
8.\"
9.\" Permission is granted to copy and distribute modified versions of this
10.\" manual under the conditions for verbatim copying, provided that the
11.\" entire resulting derived work is distributed under the terms of a
12.\" permission notice identical to this one.
c13182ef 13.\"
2c731798
MK
14.\" Since the Linux kernel and libraries are constantly changing, this
15.\" manual page may be incorrect or out-of-date. The author(s) assume no
16.\" responsibility for errors or omissions, or for damages resulting from
10d76543
MK
17.\" the use of the information contained herein. The author(s) may not
18.\" have taken the same level of care in the production of this manual,
19.\" which is licensed free of charge, as they might when working
20.\" professionally.
c13182ef 21.\"
2c731798
MK
22.\" Formatted or processed versions of this manual, if unaccompanied by
23.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 24.\" %%%LICENSE_END
2c731798 25.\"
97986708 26.TH SEM_WAIT 3 2016-03-15 "Linux" "Linux Programmer's Manual"
2c731798 27.SH NAME
6f4b6fc9 28sem_wait, sem_timedwait, sem_trywait \- lock a semaphore
2c731798
MK
29.SH SYNOPSIS
30.nf
31.B #include <semaphore.h>
32.sp
33.BI "int sem_wait(sem_t *" sem );
5895e7eb 34.sp
2c731798 35.BI "int sem_trywait(sem_t *" sem );
5895e7eb 36.sp
2c731798
MK
37.BI "int sem_timedwait(sem_t *" sem ", const struct timespec *" abs_timeout );
38.fi
cc4615cc 39.sp
2c5f8c8c 40Link with \fI\-pthread\fP.
fce1dd17 41.sp
cc4615cc
MK
42.in -4n
43Feature Test Macro Requirements for glibc (see
44.BR feature_test_macros (7)):
45.in
46.sp
cc4615cc 47.BR sem_timedwait ():
a446ac0c 48_POSIX_C_SOURCE\ >=\ 200112L
2c731798
MK
49.SH DESCRIPTION
50.BR sem_wait ()
51decrements (locks) the semaphore pointed to by
52.IR sem .
53If the semaphore's value is greater than zero,
54then the decrement proceeds, and the function returns, immediately.
55If the semaphore currently has the value zero,
c13182ef 56then the call blocks until either it becomes possible to perform
2c731798
MK
57the decrement (i.e., the semaphore value rises above zero),
58or a signal handler interrupts the call.
59
60.BR sem_trywait ()
61is the same as
62.BR sem_wait (),
63except that if the decrement cannot be immediately performed,
c13182ef
MK
64then call returns an error
65.RI ( errno
2c731798
MK
66set to
67.BR EAGAIN )
68instead of blocking.
69
70.BR sem_timedwait ()
c13182ef 71is the same as
2c731798
MK
72.BR sem_wait (),
73except that
74.I abs_timeout
c13182ef 75specifies a limit on the amount of time that the call
2c731798 76should block if the decrement cannot be immediately performed.
c13182ef 77The
2c731798 78.I abs_timeout
c13182ef 79argument points to a structure that specifies an absolute timeout
f49c451a 80in seconds and nanoseconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
2c731798
MK
81This structure is defined as follows:
82
83.nf
a08ea57c 84.in +4n
2c731798
MK
85struct timespec {
86 time_t tv_sec; /* Seconds */
87 long tv_nsec; /* Nanoseconds [0 .. 999999999] */
88};
a08ea57c 89.in
2c731798
MK
90.fi
91.PP
92If the timeout has already expired by the time of the call,
93and the semaphore could not be locked immediately,
c13182ef 94then
2c731798
MK
95.BR sem_timedwait ()
96fails with a timeout error
97.RI ( errno
98set to
99.BR ETIMEDOUT ).
100
101If the operation can be performed immediately, then
102.BR sem_timedwait ()
103never fails with a timeout error, regardless of the value of
104.IR abs_timeout .
c13182ef 105Furthermore, the validity of
2c731798
MK
106.I abs_timeout
107is not checked in this case.
108.SH RETURN VALUE
c13182ef 109All of these functions return 0 on success;
2c731798
MK
110on error, the value of the semaphore is left unchanged,
111\-1 is returned, and
c13182ef 112.I errno
2c731798
MK
113is set to indicate the error.
114.SH ERRORS
115.TP
116.B EINTR
01538d0d
MK
117The call was interrupted by a signal handler; see
118.BR signal (7).
2c731798
MK
119.TP
120.B EINVAL
121.I sem
122is not a valid semaphore.
123.PP
124The following additional error can occur for
125.BR sem_trywait ():
126.TP
127.B EAGAIN
128The operation could not be performed without blocking (i.e., the
129semaphore currently has the value zero).
4509e795 130.PP
2c731798
MK
131The following additional errors can occur for
132.BR sem_timedwait ():
133.TP
134.B EINVAL
135The value of
136.I abs_timeout.tv_nsecs
137is less than 0, or greater than or equal to 1000 million.
138.TP
139.B ETIMEDOUT
140The call timed out before the semaphore could be locked.
c13182ef 141.\" POSIX.1-2001 also allows EDEADLK -- "A deadlock condition
2c731798 142.\" was detected", but this does not occur on Linux(?).
498b329f 143.SH ATTRIBUTES
8141aab5
PH
144For an explanation of the terms used in this section, see
145.BR attributes (7).
146.TS
147allbox;
148lbw26 lb lb
149l l l.
150Interface Attribute Value
151T{
498b329f
PH
152.BR sem_wait (),
153.BR sem_trywait (),
498b329f 154.BR sem_timedwait ()
8141aab5
PH
155T} Thread safety MT-Safe
156.TE
2b2581ee 157.SH CONFORMING TO
e4dc59e7 158POSIX.1-2001, POSIX.1-2008.
2c731798
MK
159.SH NOTES
160A signal handler always interrupts a blocked call to
161one of these functions, regardless of the use of the
162.BR sigaction (2)
163.B SA_RESTART
164flag.
165.\" sem_wait() is always interrupted on most other implementations,
166.\" but on FreeBSD 5.4 SA_RESTART does cause restarting.
2c731798
MK
167.SH EXAMPLE
168.PP
c13182ef 169The (somewhat trivial) program shown below operates on an
2c731798
MK
170unnamed semaphore.
171The program expects two command-line arguments.
172The first argument specifies a seconds value that is used to
173set an alarm timer to generate a
174.B SIGALRM
175signal.
176This handler performs a
fb186734 177.BR sem_post (3)
2c731798
MK
178to increment the semaphore that is being waited on in
179.I main()
c13182ef 180using
2c731798
MK
181.BR sem_timedwait ().
182The second command-line argument specifies the length
c13182ef 183of the timeout, in seconds, for
2c731798
MK
184.BR sem_timedwait ().
185The following shows what happens on two different runs of the program:
186
a08ea57c 187.in +4n
2c731798 188.nf
b43a3b30 189.RB "$" " ./a.out 2 3"
2c731798
MK
190About to call sem_timedwait()
191sem_post() from handler
2c731798 192sem_timedwait() succeeded
b43a3b30 193.RB "$" " ./a.out 2 1"
2c731798
MK
194About to call sem_timedwait()
195sem_timedwait() timed out
196.fi
a08ea57c 197.in
9c330504 198.SS Program source
d84d0300 199\&
2c731798 200.nf
2c731798
MK
201#include <unistd.h>
202#include <stdio.h>
203#include <stdlib.h>
204#include <semaphore.h>
205#include <time.h>
206#include <assert.h>
207#include <errno.h>
208#include <signal.h>
209
2c731798
MK
210sem_t sem;
211
4407d3d8
MK
212#define handle_error(msg) \\
213 do { perror(msg); exit(EXIT_FAILURE); } while (0)
214
2c731798
MK
215static void
216handler(int sig)
217{
6ba73a73
MK
218 write(STDOUT_FILENO, "sem_post() from handler\\n", 24);
219 if (sem_post(&sem) == \-1) {
220 write(STDERR_FILENO, "sem_post() failed\\n", 18);
221 _exit(EXIT_FAILURE);
222 }
223}
2c731798
MK
224
225int
226main(int argc, char *argv[])
227{
228 struct sigaction sa;
229 struct timespec ts;
230 int s;
231
6ba73a73
MK
232 if (argc != 3) {
233 fprintf(stderr, "Usage: %s <alarm\-secs> <wait\-secs>\\n",
234 argv[0]);
235 exit(EXIT_FAILURE);
236 }
2c731798 237
4407d3d8
MK
238 if (sem_init(&sem, 0, 0) == \-1)
239 handle_error("sem_init");
2c731798
MK
240
241 /* Establish SIGALRM handler; set alarm timer using argv[1] */
242
243 sa.sa_handler = handler;
244 sigemptyset(&sa.sa_mask);
245 sa.sa_flags = 0;
5ce7e85e 246 if (sigaction(SIGALRM, &sa, NULL) == \-1)
4407d3d8 247 handle_error("sigaction");
2c731798
MK
248
249 alarm(atoi(argv[1]));
250
251 /* Calculate relative interval as current time plus
252 number of seconds given argv[2] */
253
4407d3d8
MK
254 if (clock_gettime(CLOCK_REALTIME, &ts) == \-1)
255 handle_error("clock_gettime");
256
2c731798
MK
257 ts.tv_sec += atoi(argv[2]);
258
259 printf("main() about to call sem_timedwait()\\n");
29059a65 260 while ((s = sem_timedwait(&sem, &ts)) == \-1 && errno == EINTR)
6ba73a73 261 continue; /* Restart if interrupted by handler */
2c731798
MK
262
263 /* Check what happened */
264
29059a65 265 if (s == \-1) {
2c731798
MK
266 if (errno == ETIMEDOUT)
267 printf("sem_timedwait() timed out\\n");
268 else
6ba73a73 269 perror("sem_timedwait");
2c731798
MK
270 } else
271 printf("sem_timedwait() succeeded\\n");
272
6ba73a73 273 exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
2c731798
MK
274}
275.fi
47297adb 276.SH SEE ALSO
8b98f282 277.BR clock_gettime (2),
2c731798
MK
278.BR sem_getvalue (3),
279.BR sem_post (3),
1d7c4d16
MK
280.BR sem_overview (7),
281.BR time (7)