sigwaitinfo, sigtimedwait — synchronously wait for queued signals
#include <signal.h>
int sigwaitinfo( |
const sigset_t *set, |
siginfo_t *info) ; |
int sigtimedwait( |
const sigset_t *set, |
siginfo_t *info, | |
const struct timespec *timeout) ; |
Note | |||
---|---|---|---|
|
sigwaitinfo
() suspends
execution of the calling thread until one of the signals in
set
is delivered. (If
one of the signals in set
is already pending for the
calling thread, sigwaitinfo
()
will return immediately with information about that
signal.)
sigwaitinfo
() removes the
delivered signal from the set of pending signals and returns
the signal number as its function result. If the info
argument is not NULL, then
it returns a structure of type siginfo_t (see sigaction(2)) containing
information about the signal.
Signals returned via sigwaitinfo
() are delivered in the usual
order; see signal(7) for further
details.
sigtimedwait
() operates in
exactly the same way as sigwaitinfo
() except that it has an
additional argument, timeout
, which enables an upper
bound to be placed on the time for which the thread is
suspended. This argument is of the following type:
struct timespec { long tv_sec
; /* seconds */long tv_nsec
; /* nanoseconds */};
If both fields of this structure are specified as 0, a
poll is performed: sigtimedwait
() returns immediately, either
with information about a signal that was pending for the
caller, or with an error if none of the signals in set
was pending.
On success, both sigwaitinfo
() and sigtimedwait
() return a signal number
(i.e., a value greater than zero). On failure both calls
return −1, with errno
set
to indicate the error.
No signal in set
was delivered within
the timeout
period specified to sigtimedwait
().
The wait was interrupted by a signal handler; see
signal(7). (This
handler was for a signal other than one of those in
set
.)
timeout
was
invalid.
In normal usage, the calling program blocks the signals in
set
via a prior call
to sigprocmask(2) (so that the
default disposition for these signals does not occur if they
are delivered between successive calls to sigwaitinfo
() or sigtimedwait
()) and does not establish
handlers for these signals. In a multithreaded program, the
signal should be blocked in all threads to prevent the signal
being delivered to a thread other than the one calling
sigwaitinfo
() or sigtimedwait
()).
The set of signals that is pending for a given thread is the union of the set of signals that is pending specifically for that thread and the set of signals that is pending for the process as a whole (see signal(7)).
If multiple threads of a process are blocked waiting for
the same signal(s) in sigwaitinfo
() or sigtimedwait
(), then exactly one of the
threads will actually receive the signal if it is delivered
to the process as a whole; which of the threads receives the
signal is indeterminate.
POSIX leaves the meaning of a NULL value for the
timeout
argument of
sigtimedwait
() unspecified,
permitting the possibility that this has the same meaning as
a call to sigwaitinfo
(), and
indeed this is what is done on Linux.
On Linux, sigwaitinfo
() is a
library function implemented on top of sigtimedwait
().
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsetops(3), sigwait(3), signal(7), time(7)
This page is part of release 3.24 of the Linux man-pages
project. A
description of the project, and information about reporting
bugs, can be found at
http://www.kernel.org/doc/man-pages/.
Copyright (c) 2002 Michael Kerrisk <mtk.manpagesgmail.com> Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. |