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

名前

       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_sectv_usec の両方により決定される。

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

返り値

       成功した場合、0 が返される。エラーが発生した場合、-1 が返され、 errno が適切に設定される。

エラー

       EFAULT new_value, old_value, curr_value が有効なポインターではない。

       EINVAL whichITIMER_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/ に書かれている。