getitimer - システムコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 返り値
- エラー
- 注意
- 準拠
- 関連項目
- バグ
名前
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_sec
と
tv_usec
の両方により決定される。
要求した時間がくる前にタイマーが満了することはないが、
逆にある (短い) 時間だけ遅れることはある。
どれだけ遅れるかはシステムの時間分解能とシステムの負荷に依存する
(但し、バグの項も参照のこと)。
タイマーが満了するとシグナルが生成され、タイマーは初期化される。
プロセスがアクティブな時
(
ITIMER_VIRTUAL
の場合には常にそうである) にタイマーが満了した場合、生成されたシグナルは
すぐに配送される。それ以外の場合は、システムの負荷により少しの時間だけ
遅れて配送される。
返り値
成功した場合はゼロが返る。エラーの場合は -1 が返り、
errno
が適切に設定される。
エラー
-
EFAULT
-
value
または
ovalue
が有効なポインターでない。
-
EINVAL
-
which
が
ITIMER_REAL
,
ITIMER_VIRTUAL
,
ITIMER_PROF
のどれでもない。
注意
準拠
POSIX.1-2001, SVr4, 4.4BSD (このコールは 4.2BSD で始めて現われた).
関連項目
バグ
シグナルの生成と配送は別個のものであり、
前述のシグナルのそれぞれについて一つだけがプロセスのために
待機する。
非常に重い負荷の下では、
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
の値を供給するように今のうちに修正するべきである。
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする