Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all 

名前
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 個のインターバルタイマーを提供する。 それぞれのタイマーは別々の時間領域 で減少する。 あるタイマーが満了すると、 プロセスにシグナルが送られ、 タイマーは (0 でなければ) 指定された インターバルに再設定される。 ITIMER_REAL 実時間 (real time) で減少し、満了すると SIGALRM が送られる。 ITIMER_VIRTUAL プロセスが実行されている間のみ減少し、満了すると SIGVTALRM が送られる。 ITIMER_PROF プロセスが実行されていて、 かつシステムがそのプロセスのために処理を行なっている間に減少す る。 多くの場合、このタイマーは ITIMER_VIRTUAL と組み合わされて、アプリケーションがカーネ ル空間とユーザー空間で どれだけの時間を過ごしたかをプロファイルするのに使用される。 満了す ると SIGPROF が送られる。 タイマーの値は以下の構造体によって定義される: struct itimerval { struct timeval it_interval; /* Interval for periodic timer */ struct timeval it_value; /* Time until next expiration */ }; 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 フィールドにはタイマーのインターバル (期間) が設定される。 it_interval (の両方のサ ブフィールド) で値 0 が返された場合は、 このタイマーが 1 回限りのタイマーであることを示している。 setitimer() 関数は指定されたタイマーに new_value の値を設定する。 old_value が NULL 以外の場合、タイマー の古い値 (すなわち getitimer() で返されるのと同じ情報) が 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) の前後ではイ ンターバルタイマーは保存される。 POSIX.1 では、 setitimer() と、 alarm(2), sleep(3), usleep(3) という 3 つのインターフェースとの相互の影 響については規定していない。 標準では、次の呼び出しの意味については規定されていない。 setitimer(which, NULL, &old_value); (Solaris, BSD 系やおそらく他のシステムもそうだが) 多くのシステムでは、この呼び出しは以下と等価である。 getitimer(which, &old_value); Linux では、この呼び出しは new_value フィールドが 0 の呼び出しと等価なものと扱われる。 つまり、タイマーが 無効になる。 Linux のこの間違った機能を使用しないこと。移植性もなく、不必要な機能である。
バグ
シグナルの生成と配送は別個のものであり、 前述のシグナルのそれぞれについて一つだけがプロセスのために 待機 する。 非常に重い負荷の下では、 ITIMER_REAL タイマーでは、時間切れにより生成された一つ前のシグナルが配送 される前に、 次の時間切れが起こる場合がある。 そのような場合、 2 個めのイベントに対するシグナルは失われて しまう。 バージョン 2.6.16 より前の Linux カーネルでは、 タイマーの値は jiffy で表現される。 要求が jiffy 表現で (include/linux/jiffies.h で定義されている) MAX_SEC_IN_JIFFIES を越える値をタイマーに設定しようとするもの の場合、 タイマーは暗黙にこの上限値に切り詰められる。 Linux/i386 の場合 (Linux 2.6.13 以降では jiffy は 0.004 秒) の場合、 これはタイマーの上限値がおよそ 99.42 日になることを意味する。 Linux 2.6.16 以降で は、カーネルは時間に関する内部表現として 異なる表現を使うようになっており、この上限はなくなった。 (i386 を含む) いくつかのシステムでは、 バージョン 2.6.12 以前の Linux カーネルは ある種の状況では 1 jiffy 早くタイマーが終了してしまうというバグがあった。 このバグはカーネル 2.6.12 で修正された。 POSIX.1-2001 では setitimer() は tv_usec の値が 0 から 999999 の範囲外である場合には失敗するべきだとして いる。 しかし、2.6.21 以前のカーネルの Linux ではエラーにならず、 対応する秒数の分だけそのタイマーの秒の 値が暗黙に調整される。 カーネル 2.6.22 以降では、この標準非準拠の動作は修正され、 tv_usec の値が不適切な 場合には EINVAL エラーとなる。
関連項目
gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部である。 プロジェクトの説明とバグ報告 に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。