GETITIMER(2)

名前
getitimer, setitimer - インターバル・タイマーの値を取得または設定する

書式
#include <sys/time.h>

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

説明
システムはプロセスごとに、それぞれは独特な時間で減少する、三っつの インターバル・タイマーを提供する。どれかのタイマーが切れた場合には プロセスにシグナルが送られ、タイマーは(潜在的に)再起動される。

ITIMER_REAL
    は実時間(real time)で減少し、切れた場合には SIGALRM が配送される。

ITIMER_VIRTUAL
    はプロセスが実行されている間のみ減少し、切れた場合は SIGVTALRM が配送される。

ITIMER_PROF
    はプロセスが実行されている間と そのプロセスのためにシステムが実行されている間に減少する。 ITIMER_VIRTUAL と組み合わせて、このタイマーはたいていアプリケーションが カーネル空間とユーザー区間でどれだけの時間を過ごしたかプロファイル するのに使用される。 切れた場合には SIGPROF が配送される。

タイマーの値は以下の構造体によって定義される:
    struct itimerval {
        struct timeval it_interval; /* next value */
        struct timeval it_value;    /* current value */
    };
    struct timeval {
        long tv_sec;                /* seconds */
        long tv_usec;               /* microseconds */
    };

getitimer(2) は value で指定された構造体に which で指定された ( ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF のどれかの) タイマーの現在の設定を格納する。 it_value 要素にはタイマーの残り時間が設定される。タイマーがオフの場合は ゼロが設定される。同様に it_interval には初期値が設定される。 setitimer(2) は指定されたタイマーに value の値を設定する。 ovalue がゼロでなければ、タイマーの古い値がそこに格納される。

タイマーは it_value からゼロへ向けて減っていき、シグナルを生成し、 it_interval に初期化される。 タイマーがゼロに設定された( it_value がゼロか、タイマーが切れた時に it_interval がゼロの)場合は停止する。

tv_sec と tv_usec の両方がタイマー間隔を決定するのに意味がある。

要求した時間がくるまえにタイマーが切れることはないが、 システムの時間分解(現在は 10ms)に依存する短い一定の時間遅れる。 切れた場合にはシグナルが生成され、タイマーが初期化される。プロセスが アクティブ(active)な時( ITIMER_VIRT 場合には常に真)にタイマーが切れた場合、シグナルは生成されるとすぐに 配送される。そうでなればシステムの負荷により少しの時間だけ遅れて 配送される。

返り値
成功した場合はゼロが返される。エラーの場合は -1 を返され、 errno が適切に設定される。

エラー

EFAULT
    value または ovalue が有効なポインターでない。

EINVAL
    which が ITIMER_REAL, ITIMER_VIRT, ITIMER_PROF のどれかでない。

準拠
SVr4, 4.4BSD (このコールは 4.2BSD で始めて現われた).

関連項目
gettimeofday(2), sigaction(2), signal(2).

バグ
Linux において、シグナルの生成と配送は独特であり、それぞれのシグナルは 特有のイベントが起きた時のみ許される。それで異常に重い負荷の下では ITIMER_REAL は以前のシグナルが配送される前に切れてしまうことがある。そのような場合は 二番目のシグナルは失なわれてしまう。