名前


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

書式


#include <sys/time.h>

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

説明


システムは 1 個のプロセスにつき 3 個のインターバル・タイマーを提供する。 それぞれのタイマーは別々の時間領域で減少する。 どのタイマーも満了するとプロセスにシグナルが送られ、 タイマーは (設定によっては) 再び開始される。
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() 関数は value で指定された構造体に which で指定された (ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF のどれかの) タイマーの現在の設定を格納する。 it_value 要素にはタイマーの残り時間が設定される。タイマーがオフの場合は ゼロが設定される。同様に it_interval には初期値が設定される。 setitimer() 関数は指定されたタイマーに value の値を設定する。 ovalue がゼロでなければ、タイマーの古い値がそこに格納される。

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

タイマーの期間は tv_sectv_usec の両方により決定される。

要求した時間がくる前にタイマーが満了することはないが、 逆にある (短い) 時間だけ遅れることはある。 どれだけ遅れるかはシステムの時間分解能とシステムの負荷に依存する (但し、バグの項も参照のこと)。 タイマーが満了するとシグナルが生成され、タイマーは初期化される。 プロセスがアクティブな時 (ITIMER_VIRTUAL の場合には常にそうである) にタイマーが満了した場合、生成されたシグナルは すぐに配送される。それ以外の場合は、システムの負荷により少しの時間だけ 遅れて配送される。

返り値


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

エラー


EFAULT value または ovalue が有効なポインターでない。
EINVAL whichITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF のどれでもない。

準拠


POSIX.1-2001, SVr4, 4.4BSD (このコールは 4.2BSD で始めて現われた).

注意


fork(2) で作成された子プロセスは、 親プロセスのインターバル・タイマーを継承しない。 execve(2) の前後ではインターバル・タイマーは保存される。

バグ


シグナルの生成と配送は別個のものであり、 前述のシグナルのそれぞれについて一つだけがプロセスのために 待機する。 非常に重い負荷の下では、 ITIMER_REAL について、 1 つ前の時間切れに由来するシグナルが配送される前に、 時間が切れてしまうことが起こりうる。 そのような場合、 2 個めのイベントに対するシグナルは失われてしまう。

Linux では、タイマーの値は jiffy で表現される。 要求が jiffy 表現で (include/linux/jiffies.h で定義されている) MAX_SEC_IN_JIFFIES を越える値をタイマーに設定しようとする ものの場合、タイマーは暗黙にこの上限値に切り詰められる。 Linux/x86 の場合 (カーネル 2.6.13 以降では jiffy は 0.004 秒) の場合、 これはタイマーの上限値がおよそ 99.42 日になることを意味する。

(x86 を含む) いくつかのシステムでは、 バージョン 2.6.12 以前の Linux カーネルは ある種の状況では 1 jiffy 早くタイマーが終了してしまうというバグがあった。 このバグはカーネル 2.6.12 で修正された。

POSIX.1-2001 では setitimer() は tv_usec の値が 0 から 999999 の範囲外である場合には失敗するべきだとしている。 しかし、Linux ではエラーにならず、 対応する秒数の分だけそのタイマーの秒の値が暗黙に調整される。 将来(予定では 2007 年 3 月)、この不一致は修正される: 既存のアプリケーションは確実に正しい形の tv_usec の値を供給するように今のうちに修正するべきである。

関連項目


gettimeofday(2), sigaction(2), signal(2), time(7)

openSUSE Logo

コンテンツ