#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() で同じシグナルを待って停止した場合、 プロセス全体宛てのシグナルが処理待ちになると、複数のスレッドのうち一つだけが 実際にそのシグナルを受信することになる。 どのスレッドがシグナルを受信するかは決まっていない。
POSIX では sigtimedwait() の引き数 timeout の値を NULL にした場合の意味を未定義としている。 sigwaitinfo() を呼び出したのと同じ意味としてもよいことになっており、 実際 Linux ではこのように動作する。
素の sigtimedwait() システムコールは 5 番目の引き数 size_t sigsetsize を取る。 この引き数は set 引き数のバイト単位のサイズを指定する。 glibc の sigtimedwait() のラッパー関数はこの引き数に固定値 (sizeof(sigset_t) と同じ) を指定する。