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]](../stylesheet/note.png) | 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;long tv_nsec;}; 
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)).
Attempts to wait for SIGKILL
      and SIGSTOP are silently
      ignored.
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(3), sigsetops(3), sigwait(3), signal(7), time(7)
This page is part of release 3.35 of the Linux man-pages project. A
      description of the project, and information about reporting
      bugs, can be found at http://man7.org/linux/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. |