EN JA
SIGTIMEDWAIT(2)
SIGTIMEDWAIT(2) FreeBSD System Calls Manual SIGTIMEDWAIT(2)

名称

sigtimedwait, sigwaitinfoキューに入れられたシグナルをウェートする (リアルタイム)

ライブラリ

Standard C Library (libc, -lc)

書式

#include < signal.h>

int
sigtimedwait( const sigset_t *restrict set, siginfo_t *restrict info, const struct timespec *restrict timeout);

int
sigwaitinfo( const sigset_t * restrict set, siginfo_t * restrict info);

解説

set によって指定されたシグナルのいずれも保留中 (pending) でないなら、 sigtimedwait() が timeout によって参照される timespec 構造体で指定された時間の間隔をウェート (待つ) することを除いて、 sigtimedwait() システムコールは、 sigwaitinfo() と同等です。 timeout によって指された timespec 構造体が 0 以外の値であり、 set によって指定されたシグナルのいずれも保留中でないなら、 sigtimedwait() は、直ちにエラーで返ります。 timeoutNULL ポインタであるなら、振る舞いは、未特定です。 CLOCK_MONOTONIC クロックは、 timeout 引数によって指定された時間の間隔を測定するために使用されます。

sigwaitinfo() システムコールは、 set によって指定された設定からの保留中のシグナルを選択します。範囲 SIGRTMIN から SIGRTMAX の複数の保留中のシグナルのどれかが選択されるならば、それは、最も低く番号付けられたものとなるしょう。リアルタイムと非リアルタイムシグナルの間、または、複数の保留中の非リアルタイムシグナルの間の選択順序は、不特定です。呼び出し時点で set でのシグナルが保留中でないなら、 set の 1 つ以上のシグナルが保留中になるまでか、またはアンブロックされ、シグナルをキャッチすることよって割り込まれるまで、呼び出しスレッドは、サスペンドされます。

sigwaitinfo() システムコールは、 info 引数が NULL であるなら、 sigwait() システムコールと同等です。 info 引数が NULL でないなら、 sigwaitinfo() 関数は、選択されたシグナル番号が si_signo メンバに格納されるものとし、シグナルの原因が si_code メンバに格納されるものとすることを除いて、 sigwait() と同等です。このほかに、 sigwaitinfo() と sigtimedwait() システムコールは、 sigwait() 関数のために許可されていない、シグナルによって割り込まれるなら、 EINTR を返します。

任意の値が選択されたシグナルのためにキューに入れられるなら、最初にそのようなキューに入れられた値がデキュー (キューから出) され、 info 引数が NULL でないなら、値は、 infosi_value メンバに格納されます。シグナルをキューに入れるために使用されるシステムリソースは、解放して、他の使用のためにシステムに返します。値がキューに入れられないなら、 si_value メンバの内容は、0 の値にされます。さらなるシグナルが選択されたシグナルのためにキューに入れられないなら、そのシグナルのための保留中の指示は、リセットされます。

戻り値

成功して終了する (すなわち、 set によって指定されたシグナルの 1 つが保留中であるか、または生成される) とき、 sigwaitinfo() と sigtimedwait() は、選択されたシグナル番号を返します。そうでなければ、関数は、-1 の値を返し、グローバル変数 errno にエラーを示す値が設定されます。

エラー

sigtimedwait() システムコールは、次の場合に失敗します:
[ EAGAIN]
設定によって指定されたシグナルが、指定されたタイムアウト期間に生成されませんでした。

sigtimedwait() と sigwaitinfo() システムコールは、次の場合に失敗します:

[ EINTR]
ウェート (待ち) は、アンブロックされ、シグナルをキャッチすることよって割り込まれました。

また sigtimedwait() システムコールは、次の場合に失敗します:

[ EINVAL]
timeout 引数に 0 未満か、10 億以上の tv_nsec 値が指定されました。シグナルが set で保留中でないなら、カーネルだけが、このエラーをチェックし、ウェート (待つ) する必要があります。

規格

sigtimedwait() と sigwaitinfo() システムコールは、 ISO/IEC 9945-1:1996 (“POSIX.1”) に適合します。
September 27, 2012 FreeBSD