#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);
タイマーの値は以下の構造体によって定義される:
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() 関数は、 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 の場合には常にそうである) にタイマーが満了した場合、生成されたシグナルは すぐに配送される。それ以外の場合は、システムの負荷により少しの時間だけ 遅れて配送される。
POSIX.1 では、 setitimer() と、 alarm(2), sleep(3), usleep(3) という 3 つのインタフェースとの相互の影響については規定していない。
バージョン 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 エラーとなる。