名前


sigwaitinfo, sigtimedwait - キューに入れられたシグナルを同期して待つ

書式


#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);

説明


sigwaitinfo() は set のうちのどれかのシグナルが配送されるまで、 呼び出しプロセスの実行を一時停止する (呼び出しプロセスに対して set のうちのどれかのシグナルが既に待機中 (pending) である場合、 sigwaitinfo() はそのシグナルの情報を返してすぐに戻る)。

sigwaitinfo() は配送されたシグナルを呼び出しプロセスの 待機中のシグナルのリストから削除し、 関数の結果としてシグナル番号を返す。 info 引き数が NULL でない場合、配送されたシグナルの情報が入った siginfo_t 型 (sigaction(2) を参照) の構造体を返す。

sigwaitinfo() で返されるシグナルは、通常の順番で配送される。 詳細は signal(7) を参照すること。

sigtimedwait() は、 sigwaitinfo() と次の点を除いて全く同じように動作する。 この関数にはもう 1 つの引き数 timeout があり、プロセスが一時停止する時間の上限を定めることができる。 この引き数の型は以下のとおりである:

struct timespec { long tv_sec; /* 秒 */ long tv_nsec; /* ナノ秒 */ }

この構造体の 2 つのフィールドがともに 0 の場合、ポーリングが行われる: sigtimedwait() は、呼び出し側プロセスに対して 待機しているシグナルの情報を返して戻るか、 set のうちのどのシグナルも待機していない場合はエラーを返して戻る。

返り値


成功した場合、 sigwaitinfo() と sigtimedwait() はシグナル番号 (すなわち 0 より大きい数) を返す。 失敗した場合、2 つの関数は -1 を返し、 errno はエラーを表す値に設定される。

エラー


EAGAIN set のうちのどのシグナルも sigtimedwait() に指定された timeout の期間内に配送されなかった。
EINTR シグナル待ちがシグナルハンドラによって中断 (interrupt) された (このハンドラは set にあるシグナル以外のものである)。
EINVAL timeout が不正である。

準拠


POSIX.1-2001

注意


通常の使用法では、呼び出し側プロセスはこれらの関数より先に sigprocmask(2) の呼び出すことにより set に含まれるシグナルをブロックし (そのためにこれらのシグナルがこの後に続く sigwaitinfo() や sigtimedwait() の呼び出しの間に配送された場合には、 デフォルトの配置は行われず)、 これらのシグナルに対するハンドラは設定しない。 マルチスレッドプログラムでは、 sigwaitinfo() や sigtimedwait() を呼び出したスレッド以外のスレッドにそのシグナルが配送されないように、 全てのスレッドで該当シグナルをブロックすべきである。

POSIX では sigtimedwait() の引き数 timeout の値を NULL にした場合の意味を未定義としている。 sigwaitinfo() を呼び出したのと同じ意味としてもよいことになっており、 実際 Linux ではこのように動作する。

関連項目


kill(2), sigaction(2), signal(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsetops(3), signal(7)

openSUSE Logo

コンテンツ