#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);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
sigwaitinfo(), sigtimedwait(): _POSIX_C_SOURCE >= 199309L
sigwaitinfo() はそのシグナルを待機中のシグナルの集合から削除し、関数の結果としてシグナル番号を返す。 info 引数が NULL でない場合、配送されたシグナルの情報が入った siginfo_t 型 (sigaction(2) を参照) の構造体を info が指すバッファーに入れて返す。
呼び出し元に対して set の複数のシグナルが処理待ちの場合、 sigwaitinfo() で取得するシグナルは通常の順序決定ルールに基づいて決定される。 詳細は signal(7) を参照のこと。
sigtimedwait() は、 sigwaitinfo() と次の点を除いて全く同じように動作する。この関数にはもう 1 つの引数 timeout があり、シグナル待ちでスレッドが一時停止する時間を指定することができる(この時間はシステムクロックの粒度に切り上げられ、カーネルのスケジューリング遅延により少しだけ長くなる可能性がある)。この引数の型は以下のとおりである:
struct timespec {
long tv_sec; /* 秒 */
long tv_nsec; /* ナノ秒 */
}
この構造体の 2 つのフィールドがともに 0 の場合、ポーリングが行われる: sigtimedwait() は、呼び出し側プロセスに対して 待機しているシグナルの情報を返して戻るか、 set のうちのどのシグナルも待機していない場合はエラーを返して戻る。
指定されたスレッドに対する処理待ちのシグナルの集合は、 そのスレッド自体宛ての処理待ちのシグナル集合と、プロセス全体宛ての 処理待ちのシグナル集合をあわせたものである (signal(7) 参照)。
SIGKILL と SIGSTOP を待とうとした場合、黙って無視される。
一つのプロセス内の複数のスレッドが sigwaitinfo() や sigtimedwait() で同じシグナルを待って停止した場合、 プロセス全体宛てのシグナルが処理待ちになると、複数のスレッドのうち一つだけが 実際にそのシグナルを受信することになる。 どのスレッドがシグナルを受信するかは決まっていない。
sigwaitinfo() or sigtimedwait(), can't be used to receive signals that are synchronously generated, such as the SIGSEGV signal that results from accessing an invalid memory address or the SIGFPE signal that results from an arithmetic error. Such signals can be caught only via signal handler.
POSIX では sigtimedwait() の引数 timeout の値を NULL にした場合の意味を未定義としている。 sigwaitinfo() を呼び出したのと同じ意味としてもよいことになっており、 実際 Linux ではこのように動作する。
The glibc wrapper functions for sigwaitinfo() and sigtimedwait() silently ignore attempts to wait for the two real-time signals that are used internally by the NPTL threading implementation. See nptl(7) for details.
The original Linux system call was named sigtimedwait(). However, with the addition of real-time signals in Linux 2.2, the fixed-size, 32-bit sigset_t type supported by that system call was no longer fit for purpose. Consequently, a new system call, rt_sigtimedwait(), was added to support an enlarged sigset_t type. The new system call takes a fourth argument, size_t sigsetsize, which specifies the size in bytes of the signal set in set. This argument is currently required to have the value sizeof(sigset_t) (or the error EINVAL results). The glibc sigtimedwait() wrapper function hides these details from us, transparently calling rt_sigtimedwait() when the kernel provides it.