Manpages

名 前

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