GETITIMER(2) | Linux Programmer's Manual | GETITIMER(2) |
名前
getitimer, setitimer -インターバル・タイマーの値を取得または設定する書式
#include <sys/time.h>
int getitimer(int which , struct itimerval * curr_value );
int setitimer(int which , const struct itimerval * new_value ,
struct itimerval * old_value );
説明
システムは 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 {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
getitimer() 関数は、 which で指定されたタイマー ( ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF のどれか) の現在の設定を、 curr_value で指定された構造体に格納する。 it_value 要素にはタイマーの残り時間が設定される。タイマーがオフの場合はゼロが設定される。同様に it_interval には初期値が設定される。
setitimer() 関数は指定されたタイマーに new_value の値を設定する。 old_value が NULL 以外の場合、タイマーの古い値が old_value に格納される。
タイマーは it_value からゼロへ向けて減っていき、シグナルを生成し、 it_interval に初期化される。タイマーがゼロに設定された場合 ( it_value がゼロか、タイマーが満了した時に it_interval がゼロの場合) は停止する。
タイマーの期間は tv_sec と tv_usec の両方により決定される。
要求した時間がくる前にタイマーが満了することはないが、逆にある (短い) 時間だけ満了が遅れることはある。どれだけ遅れるかはシステムの時間分解能とシステムの負荷に依存する ( time(7) 参照;但し、バグの項も参照のこと)。タイマーが満了するとシグナルが生成され、タイマーは初期化される。プロセスがアクティブな時 ( ITIMER_VIRTUAL の場合には常にそうである) にタイマーが満了した場合、生成されたシグナルはすぐに配送される。それ以外の場合は、システムの負荷により少しの時間だけ遅れて配送される。
返り値
成功した場合、0 が返される。エラーが発生した場合、-1 が返され、 errno が適切に設定される。エラー
- EFAULT
- new_value, old_value, curr_value が有効なポインタではない。
- EINVAL
- which が ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF のどれでもない。または (Linux 2.6.22 以降で) new_value で指定された構造体の tv_usec フィールドの一つが 0 以上 999999 以下の範囲に入らない値である。
準拠
POSIX.1-2001, SVr4, 4.4BSD (このコールは 4.2BSD で始めて現われた). POSIX.1-2008 では、 getitimer() と setitimer() は廃止予定とされており、代わりに POSIX タイマー API ( timer_gettime(2), timer_settime(2) など) を使うことが推奨されている。注意
fork(2) で作成された子プロセスは、親プロセスのインターバル・タイマーを継承しない。 execve(2) の前後ではインターバル・タイマーは保存される。setitimer(which, NULL, &old_value);
getitimer(which, &old_value);
バグ
シグナルの生成と配送は別個のものであり、前述のシグナルのそれぞれについて一つだけがプロセスのために待機する。非常に重い負荷の下では、 ITIMER_REAL タイマーでは、時間切れにより生成された一つ前のシグナルが配送される前に、次の時間切れが起こる場合がある。そのような場合、 2 個めのイベントに対するシグナルは失われてしまう。関連項目
gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-10-01 | Linux |