名 前
getrlimit, setrlimit, prlimit − 資 源 の 制 限 を 取 得 /設 定 す る
書 式
#include
<sys/time.h>
#include <sys/resource.h>
int
getrlimit(int resource, struct rlimit
*rlim);
int setrlimit(int resource, const struct
rlimit *rlim);
int
prlimit(pid_t pid, int resource,
const struct rlimit *new_limit,
struct rlimit *old_limit);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
prlimit(): _GNU_SOURCE && _FILE_OFFSET_BITS == 64
説 明
getrlimit() と setrlimit() は そ れ ぞ れ 資 源 (resource) の 制 限 (limit) の 設 定 と 取 得 を 行 う 。 各 リ ソ ー ス に は 、 そ れ に 対 応 す る ソ フ ト リ ミ ッ ト と ハ ー ド リ ミ ッ ト が あ り 、 rlimit 構 造 体 で 定 義 さ れ る :
struct rlimit {
rlim_t rlim_cur; /* ソ フ ト リ
ミ ッ ト */
rlim_t rlim_max; /* ハ ー ド リ
ミ ッ ト
(rlim_cur よ り 小 さ く
な い ) */ }; ソ フ ト
リ ミ ッ ト は 、
カ ー ネ ル が 対
応 す る リ ソ ー
ス に 対 し て 課
す 制 限 値 で あ
る 。 ハ ー ド リ
ミ ッ ト は ソ フ
ト リ ミ ッ ト の
上 限 と し て 働
く 。 特 権 を 持
た な い プ ロ セ
ス は 、 ソ フ ト
リ ミ ッ ト の 値
を 0 か ら ハ ー ド
リ ミ ッ ト の 範
囲 に 設 定 す る
こ と と 、 ハ ー
ド リ ミ ッ ト を
下 げ る こ と の
み が で き る (一
度 下 げ た ハ ー
ド リ ミ ッ ト は
上 げ ら れ な い
)。 特 権 プ ロ セ
ス (Linux で は CAP_SYS_RESOURCE
ケ ー パ ビ リ テ
ィ (capability) を 持 つ プ
ロ セ ス ) は ソ フ
ト リ ミ ッ ト と
ハ ー ド リ ミ ッ
ト を 自 由 に 変
更 で き る 。 値
RLIM_INFINITY は リ ソ ー
ス に 制 限 が な
い こ と を 表 す
(こ の 値 は getrlimit()
が 返 す 構 造 体
と setrlimit() に 渡 す
構 造 体 の 両 方
で 使 用 さ れ る
)。
resource
引 き 数 は 次 の
い ず れ か 1 つ で
あ る 。
RLIMIT_AS プ ロ セ ス の
仮 想 メ モ リ ー
(ア ド レ ス 空 間 )
の 最 大 サ イ ズ
(バ イ ト 単 位 )。
こ の 制 限 は brk(2),
mmap(2), mremap(2) の 呼 び
出 し に 影 響 し
、 こ の 制 限 を
超 え た 場 合 は
エ ラ ー ENOMEM で 失
敗 す る 。 ま た
自 動 的 な ス タ
ッ ク 拡 張 に も
失 敗 す る (さ ら
に sigaltstack(2) を 使 っ
た 代 替 ス タ ッ
ク を 利 用 可 能
に し て い な か
っ た 場 合 に は
、 SIGSEGV を 生 成 し
て そ の プ ロ セ
ス を kill す る )。 こ
の 値 は long 型 な
の で 、 32 ビ ッ ト
の long 型 を 持 つ
マ シ ン で は 、
こ の 制 限 は 最
大 で 2 GiB に な る か
、 こ の 資 源 が
無 制 限 に な る
。
RLIMIT_CORE
core フ ァ イ ル の 最 大 サ イ ズ (core(5) 参 照 )。 0 の 場 合 、 core フ ァ イ ル は 生 成 さ れ な い 。 0 以 外 の 場 合 、 こ の サ イ ズ よ り 大 き い ダ ン プ は 切 り 詰 め ら れ る 。
RLIMIT_CPU
CPU 時 間 の 上 限 (秒 数 )。 プ ロ セ ス が ソ フ ト リ ミ ッ ト に 達 し た 場 合 に 、 SIGXCPU シ グ ナ ル を 送 る 。 こ の シ グ ナ ル に 対 す る デ フ ォ ル ト の 動 作 は 、 プ ロ セ ス の 終 了 で あ る 。 た だ し 、 シ グ ナ ル を キ ャ ッ チ し て 、 ハ ン ド ラ ー が メ イ ン プ ロ グ ラ ム に 制 御 を 返 す こ と も で き る 。 プ ロ セ ス が CPU 時 間 を 使 い 続 け た 場 合 は 、 ハ ー ド リ ミ ッ ト に 達 す る ま で 1 秒 毎 に プ ロ セ ス に SIGXCPU を 送 り 、 ハ ー ド リ ミ ッ ト に 達 す る と SIGKILL を 送 る 。 (ソ フ ト リ ミ ッ ト を 超 過 し た と き の 動 作 は 、 Linux に お け る 動 作 で あ る 。 ソ フ ト リ ミ ッ ト を 超 え て CPU 時 間 を 使 い 続 け る プ ロ セ ス の 扱 い 方 に つ い て の 実 装 は 変 化 し て き て い る 。 こ の シ グ ナ ル を キ ャ ッ チ す る 必 要 の あ る 移 植 性 を 考 え た ア プ リ ケ ー シ ョ ン で は 、 最 初 に SIGXCPU を 受 け 取 っ た 時 点 で 正 し く 終 了 す べ き で あ る 。 )
RLIMIT_DATA プ
ロ セ ス の デ ー
タ セ グ メ ン ト
(初 期 化 さ れ た
デ ー タ ・ 初 期
化 さ れ て い な
い デ ー タ ・ ヒ
ー プ ) の 最 大 値
。 こ の リ ミ ッ
ト は brk(2) と sbrk(2)
の 呼 び 出 し に
影 響 す る 。 こ
れ ら の 関 数 は
、 こ の リ ソ ー
ス の ソ フ ト リ
ミ ッ ト に 達 す
る と 、 エ ラ ー
ENOMEM で 失 敗 す る
。
RLIMIT_FSIZE プ ロ セ ス
が 作 成 で き る
フ ァ イ ル サ イ
ズ の 最 大 値 。
こ の サ イ ズ を
超 え て フ ァ イ
ル を 拡 張 す る
と 、 SIGXFSZ シ グ ナ
ル を 送 る 。 デ
フ ォ ル ト で は
、 こ の シ グ ナ
ル は プ ロ セ ス
を 終 了 す る 。
プ ロ セ ス を キ
ャ ッ チ す る こ
と も で き る が
、 関 連 す る シ
ス テ ム コ ー ル
(write(2), truncate(2) な ど )
は エ ラ ー EFBIG で
失 敗 す る 。
RLIMIT_LOCKS (初 期 の Linux 2.4
の み ) こ の プ ロ
セ ス が 実 行 で
き る flock(2) ロ ッ ク
数 と fcntl(2) リ ー ス
数 の 合 計 値 を
制 限 す る 。
RLIMIT_MEMLOCK
RAM 内 に ロ ッ ク で き る メ モ リ ー の 最 大 バ イ ト 数 。 実 際 に は 、 こ の 制 限 は シ ス テ ム ペ ー ジ サ イ ズ の 最 も 近 い 倍 数 に 切 り 捨 て て 丸 め ら れ る 。 こ の 制 限 は mlock(2), mlockall(2), mmap(2) の MAP_LOCKED 操 作 に 影 響 す る 。 Linux 2.6.9 以 降 で は shmctl(2) SHM_LOCK 操 作 に も 影 響 す る 。 こ の 操 作 は 呼 び 出 し 元 プ ロ セ ス の 実 (real) ユ ー ザ ー ID に ロ ッ ク さ れ る 共 有 メ モ リ ー セ グ メ ン ト (shmget(2) を 参 照 ) の 合 計 バ イ ト 数 の 最 大 値 を 設 定 す る 。 shmctl(2) SHM_LOCK に よ る ロ ッ ク は 、 mlock(2), mlockall(2), mmap(2) の MAP_LOCKED に よ っ て 確 立 さ れ る プ ロ セ ス 毎 の メ モ リ ー ロ ッ ク と は 分 け て 数 え る 。 1 つ の プ ロ セ ス は こ の 制 限 ま で の バ イ ト を ロ ッ ク で き る 。 こ の 制 限 に は 2 つ の 種 類 が あ る 。 2.6.9 よ り 前 の Linux カ ー ネ ル で は 、 こ の 制 限 は 特 権 プ ロ セ ス に よ っ て ロ ッ ク さ れ る メ モ リ ー の 合 計 を 制 御 し て い た 。 Linux 2.6.9 以 降 で は 、 特 権 プ ロ セ ス が ロ ッ ク す る メ モ リ ー の 合 計 に 制 限 は な く 、 代 わ り に こ の 制 限 は 非 特 権 プ ロ セ ス が ロ ッ ク す る メ モ リ ー の 合 計 に 適 用 さ れ る よ う に な っ た 。
RLIMIT_MSGQUEUE (Linux 2.6.8 以 降 ) 呼 び 出 し 元 プ ロ セ ス の 実 ユ ー ザ ー ID に 対 し て 、 POSIX メ ッ セ ー ジ キ ュ ー の た め に 確 保 で き る バ イ ト 数 の 制 限 を 指 定 す る 。 こ の 制 限 は mq_open(3) に 対 し て 適 用 さ れ る 。 ユ ー ザ ー が 作 成 し た 各 々 の メ ッ セ ー ジ キ ュ ー の バ イ ト 数 は 以 下 の 式 に よ り 計 算 さ れ 、 (そ の キ ュ ー が 削 除 さ れ る ま で の 間 ) こ の 制 限 の 計 算 対 象 に 含 め ら れ る 。
Linux 3.5
以 降 :
bytes = attr.mq_maxmsg * sizeof(struct msg_msg) +
min(attr.mq_maxmsg, MQ_PRIO_MAX) *
sizeof(struct posix_msg_tree_node)+
/* オ ー バ ー ヘ ッ
ド 分 */
attr.mq_maxmsg * attr.mq_msgsize;
/* メ ッ セ ー ジ デ
ー タ 分 */
Linux 3.4
以 前 :
bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) +
/* オ ー バ ー ヘ ッ
ド 分 */
attr.mq_maxmsg * attr.mq_msgsize;
/* メ ッ セ ー ジ デ
ー タ 分 */ こ こ で
attr は mq_attr 構 造
体 で あ り 、
mq_open(3) の 第 4 引 き
数 と し て 指 定
さ れ る 。 ま た
、 構 造 体 msg_msg と
posix_msg_tree_node は カ ー
ネ ル 内 部 の 構
造 体 で あ る 。
上 記 の 式 で の
「 オ ー バ ー ヘ
ッ ド 」 加 算 分
は 、 実 装 に お
い て 必 要 と な
る オ ー バ ー ヘ
ッ ド を 考 慮 し
た も の で あ る
。 ま た 、 こ れ
に よ り 、 ユ ー
ザ ー が 長 さ 0 の
メ ッ セ ー ジ を
無 制 限 に 作 れ
な い こ と が 保
証 さ れ る (こ の
よ う な メ ッ セ
ー ジ で あ っ て
も 、 記 録 の た
め の オ ー バ ー
ヘ ッ ド で シ ス
テ ム メ モ リ ー
を 消 費 す る )。
RLIMIT_NICE (Linux 2.6.12 以 降 , 下 記 の 「 バ グ 」 の 節 も 参 照 )
setpriority(2) や nice(2) を 使 っ て 引 き 上 げ ら れ る プ ロ セ ス の nice 値 の 上 限 を 指 定 す る 。 nice 値 の 実 際 の 上 限 は 20 − rlim_cur で 計 算 さ れ る (こ の よ う な 変 な 状 況 は 、 リ ソ ー ス 制 限 値 と し て 負 の 数 を 指 定 で き な い た め 発 生 す る 。 通 常 、 負 の 値 は 特 別 な 意 味 を 持 っ て い る か ら で あ る 。 例 え ば 、 通 常 は RLIM_INFINITY の 値 は −1 で あ る )。
RLIMIT_NOFILE こ
の プ ロ セ ス が
オ ー プ ン で き
る フ ァ イ ル デ
ィ ス ク リ プ タ
ー 数 の 最 大 値
よ り 1 大 き い 値
を 指 定 す る 。
(open(2), pipe(2), dup(2) な
ど に よ り ) こ の
上 限 を 超 え よ
う と し た 場 合
、 エ ラ ー EMFILE が
発 生 す る (歴 史
的 に 、 BSD で は こ
の 上 限 は RLIMIT_OFILE
と い う 名 前 と
な っ て い る )。
RLIMIT_NPROC 呼 び 出 し
た プ ロ セ ス の
実 ユ ー ザ ー ID で
作 成 で き る 最
大 プ ロ セ ス 数
(よ り 正 確 に は Linux
で は ス レ ッ ド
数 )。 こ の 上 限
に 達 す る と 、
fork(2) は エ ラ ー
EAGAIN で 失 敗 す る
。 こ の 上 限 値
は 、 ケ ー パ ビ
リ テ ィ CAP_SYS_ADMIN か
CAP_SYS_RESOURCE の ど ち ら
か を 持 つ プ ロ
セ ス に は 適 用
さ れ な い 。
RLIMIT_RSS プ ロ セ ス の
resident set (RAM 上 に 存 在
す る 仮 想 ペ ー
ジ の 数 ) の 上 限
を (ペ ー ジ 数 で )
指 定 す る 。 こ
の 制 限 は 2.4.30 よ り
前 で し か 影 響
が な く 、 madvise(2)
に MADV_WILLNEED を 指 定
し た 関 数 コ ー
ル に し か 影 響
し な い 。
RLIMIT_RTPRIO (Linux 2.6.12 以 降 , バ
グ の 節 も 参 照 )
sched_setscheduler(2) や sched_setparam(2) を 使 っ て 設 定 で き る 、 そ の プ ロ セ ス の リ ア ル タ イ ム 優 先 度 の 上 限 を 指 定 す る 。
RLIMIT_RTTIME (Linux
2.6.25 以 降 ) リ ア ル
タ イ ム ス ケ ジ
ュ ー リ ン グ 方
針 で ス ケ ジ ュ
ー リ ン グ さ れ
る プ ロ セ ス が
ブ ロ ッ キ ン グ
型 の シ ス テ ム
コ ー ル を 呼 び
出 さ ず に 消 費
す る こ と の で
き る CPU 時 間 の 合
計 に つ い て の
上 限 を (マ イ ク
ロ 秒 単 位 で ) 指
定 す る 。 こ の
上 限 の 目 的 の
た め 、 プ ロ セ
ス が ブ ロ ッ キ
ン グ 型 の シ ス
テ ム コ ー ル を
呼 び 出 す 度 に
、 消 費 さ れ た CPU
時 間 の カ ウ ン
ト は 0 に リ セ ッ
ト さ れ る 。 プ
ロ セ ス が CPU を 使
い 続 け よ う と
し た が 他 の プ
ロ セ ス に 置 き
換 え ら れ た (preempted)
場 合 や 、 そ の
プ ロ セ ス の タ
イ ム ス ラ イ ス
が 満 了 し た 場
合 、 そ の プ ロ
セ ス が sched_yield(2) を
呼 び 出 し た 場
合 は 、 CPU 時 間 の
カ ウ ン ト は リ
セ ッ ト さ れ な
い 。 ソ フ ト リ
ミ ッ ト に 達 す
る と 、 そ の プ
ロ セ ス に SIGXCPU シ
グ ナ ル が 送 ら
れ る 。 そ の プ
ロ セ ス が こ の
シ グ ナ ル を 捕
捉 す る か 無 視
し て 、 CPU 時 間 を
消 費 し 続 け た
場 合 に は 、 ハ
ー ド リ ミ ッ ト
に 達 す る ま で 1
秒 に 1 回 SIGXCPU が
生 成 さ れ 続 け
る こ と に な る
。 ハ ー ド リ ミ
ッ ト に 達 し た
時 点 で 、 そ の
プ ロ セ ス に は
SIGKILL シ グ ナ ル が
送 ら れ る 。 こ
の 上 限 を 意 図
的 に 使 用 す る
の は 、 暴 走 し
た リ ア ル タ イ
ム プ ロ セ ス を
停 止 し て 、 シ
ス テ ム が 動 か
な く な る の を
避 け る 場 合 で
あ る 。
RLIMIT_SIGPENDING (Linux 2.6.8 以 降 )
呼 び 出 し 元 プ
ロ セ ス の 実 ユ
ー ザ ー ID に 対 し
て キ ュ ー に 入
れ ら れ る シ グ
ナ ル の 数 の 制
限 を 指 定 す る
。 こ の 制 限 を
チ ェ ッ ク す る
た め 、 標 準 シ
グ ナ ル と リ ア
ル タ イ ム シ グ
ナ ル の 両 方 が
カ ウ ン ト さ れ
る 。 し か し 、
こ の 制 限 は
sigqueue(3) に 対 し て
の み 適 用 さ れ
、 kill(2) 使 う こ と
で 、 そ の プ ロ
セ ス に 対 し て
ま だ キ ュ ー に
入 れ ら れ て い
な い シ グ ナ ル
の イ ン ス タ ン
ス を キ ュ ー に
入 れ る こ と が
で き る 。
RLIMIT_STACK プ ロ セ ス
ス タ ッ ク の 最
大 サ イ ズ を バ
イ ト 単 位 で 指
定 す る 。 こ の
上 限 に 達 す る
と 、 SIGSEGV シ グ ナ
ル が 生 成 さ れ
る 。 こ の シ グ
ナ ル を 扱 う た
め に は 、 プ ロ
セ ス は 代 り の
シ グ ナ ル ス タ
ッ ク (sigaltstack(2)) を 使
用 し な け れ ば
な ら な い 。
Linux 2.6.23 以 降 で は 、 こ の 制 限 は プ ロ セ ス の コ マ ン ド ラ イ ン 引 き 数 と 環 境 変 数 に 使 用 さ れ る 空 間 の 合 計 サ イ ズ の 上 限 の 決 定 に も 使 用 さ れ る 。 詳 細 に つ い て は execve(2) を 参 照 。
prlimit()
Linux 固 有 の prlimit() シ
ス テ ム コ ー ル
は 、 setrlimit() と
getrlimit の 機 能 を
合 わ せ て 拡 張
し た も の で あ
る 。 こ の シ ス
テ ム コ ー ル を
使 っ て 、 任 意
の プ ロ セ ス の
リ ソ ー ス 上 限
の 設 定 と 取 得
を 行 う こ と が
で き る 。
resource 引 き 数 は setrlimit() や getrlimit() と 同 じ 意 味 で あ る 。
new_limit 引 き 数 が NULL 以 外 の 場 合 、 new_limit が 指 す rlimit 構 造 体 を 使 っ て resource の ソ フ ト リ ミ ッ ト と ハ ー ド リ ミ ッ ト の 新 し い 値 が 設 定 さ れ る 。 old_limit 引 き 数 が NULL 以 外 の 場 合 、 prlimit() の 呼 び 出 し が 成 功 す る と 、 resource の 直 前 の ソ フ ト リ ミ ッ ト と ハ ー ド リ ミ ッ ト が old_limit が 指 す rlimit 構 造 体 に 格 納 さ れ る 。
pid 引 き 数 は 呼 び 出 し の 操 作 対 象 と な る プ ロ セ ス ID を 指 定 す る 。 pid が 0 の 場 合 、 呼 び 出 し は 呼 び 出 し 元 プ ロ セ ス に 対 し て 適 用 さ れ る 。 自 分 以 外 の プ ロ セ ス の リ ソ ー ス の 設 定 と 取 得 を 行 う た め に は 、 呼 び 出 し 元 プ ロ セ ス が CAP_SYS_RESOURCE ケ ー パ ビ リ テ ィ を 持 っ て い る か 、 対 象 と な る プ ロ セ ス の 実 ユ ー ザ ー ID、 実 効 ユ ー ザ ー ID、 保 存 set−user−ID が 呼 び 出 し 元 プ ロ セ ス の 実 ユ ー ザ ー ID と 一 致 し 、 か つ 、 対 象 と な る プ ロ セ ス の 実 グ ル ー プ ID、 実 効 グ ル ー プ ID、 保 存 set−group−ID が 呼 び 出 し 元 プ ロ セ ス の 実 グ ル ー プ ID と 一 致 し て い な け れ ば な ら な い 。
返 り 値
成 功 し た 場 合 、 こ れ ら の シ ス テ ム コ ー ル は 0 を 返 す 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
EFAULT 場 所 を 指 す ポ イ ン タ ー 引 き 数 が ア ク セ ス 可 能 な ア ド レ ス 空 間 外 を 指 し て い る 。 | |
EINVAL |
resource で 指 定 さ れ た 値 が 有 効 で な い 。 ま た は 、 setrlimit() や prlimit() で 、 rlim−>rlim_cur が rlim−>rlim_max よ り も 大 き か っ た 。
EPERM 非 特 権 プ ロ セ ス が ハ ー ド リ ミ ッ ト を 増 や そ う と し た 。 こ の 操 作 に は |
CAP_SYS_RESOURCE ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
EPERM 呼 び 出 し 元 が ハ ー ド リ ミ ッ ト |
RLIMIT_NOFILE を /proc/sys/fs/nr_open |
(proc(5) 参 照 ) で 定 義 さ れ る 最 大 値 よ り 大 き な 値 に 増 や そ う と し た 。
EPERM |
(prlimit()) 呼 び 出 し 元 の プ ロ セ ス が pid で 指 定 さ れ た プ ロ セ ス の 上 限 を 設 定 す る 許 可 を 持 っ て い な か っ た 。 | ||
ESRCH |
pid で 指 定 さ れ た ID の プ ロ セ ス が 見 つ か ら な か っ た 。 |
バ ー ジ ョ ン
prlimit() シ ス テ ム コ ー ル は Linux 2.6.36 以 降 で 利 用 で き る 。 ラ イ ブ ラ リ の サ ポ ー ト は glibc 2.13 以 降 で 利 用 で き る 。
準 拠
getrlimit(),
setrlimit(): SVr4, 4.3BSD, POSIX.1−2001.
prlimit(): Linux 固 有 。
RLIMIT_MEMLOCK と RLIMIT_NPROC は BSD か ら 派 生 し 、 POSIX.1−2001 に は 指 定 さ れ て い な い 。 こ れ ら は BSD 系 と Linux に 存 在 す る が 、 他 の 実 装 は 少 な い 。 RLIMIT_RSS は BSD か ら 派 生 し 、 POSIX.1−2001 に は 指 定 さ れ て い な い 。 そ れ に も 関 わ ら ず 多 く の 実 装 で 存 在 す る 。 RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME, RLIMIT_SIGPENDING は Linux 固 有 の も の で あ る 。
注 意
fork(2) で 作 成 さ れ た 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の リ ソ ー ス 制 限 を 継 承 す る 。 execve(2) の 前 後 で リ ソ ー ス 制 限 は 保 存 さ れ る 。 リ ソ ー ス の ソ フ ト リ ミ ッ ト を そ の プ ロ セ ス が 現 在 の リ ソ ー ス 使 用 量 よ り 小 さ い 値 に 設 定 す る こ と は で き る (但 し 、 そ の プ ロ セ ス は そ れ 以 降 そ の リ ソ ー ス の 使 用 量 を 増 や す こ と が で き な く な る )。 シ ェ ル の リ ソ ー ス 制 限 は 、 シ ェ ル の 組 み 込 み コ マ ン ド で あ る ulimit (csh(1) で は limit ) を 使 っ て 設 定 す る こ と が で き る 。 こ の シ ェ ル の リ ソ ー ス 制 限 は 、 コ マ ン ド を 実 行 し て シ ェ ル が 生 成 す る プ ロ セ ス に 引 き 継 が れ る 。
Linux 2.6.24 以 降 で は 、 プ ロ セ ス の リ ソ ー ス 上 限 は /proc/[pid]/limits で 知 る こ と が で き る 。 proc(5) 参 照 。 古 い シ ス テ ム で は 、 setrlimit() と 同 様 の 目 的 を 持 つ 関 数 vlimit() が 提 供 さ れ て い た 。 後 方 互 換 性 の た め 、 glibc で も vlimit() を 提 供 し て い る 。 全 て の 新 し い ア プ リ ケ ー シ ョ ン で は 、 setrlimit() を 使 用 す べ き で あ る 。
C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い バ ー ジ ョ ン 2.13 以 降 で は 、 glibc の getrlimit() と setrlimit() の ラ ッ パ ー 関 数 は も は や 対 応 す る シ ス テ ム コ ー ル を 呼 び 出 さ ず 、 代 わ り に 「 バ グ 」 の 節 で 説 明 さ れ て い る 理 由 か ら prlimit() を 利 用 し て い る 。
バ グ
以 前 の Linux カ ー ネ ル で は 、 プ ロ セ ス が ソ フ ト ま た は ハ ー ド RLIMIT_CPU リ ミ ッ ト に 達 し た 場 合 に 送 ら れ る SIGXCPU と SIGKILL シ グ ナ ル が 、 本 来 送 ら れ る べ き 時 点 の 1 (CPU) 秒 後 に 送 ら れ て し ま う 。 こ れ は カ ー ネ ル 2.6.8 で 修 正 さ れ た 。
2.6.17 よ り 前 の 2.6.x カ ー ネ ル で は 、 RLIMIT_CPU リ ミ ッ ト が 0 の 場 合 、 (RLIM_INFINITY と 同 じ よ う に ) 「 制 限 な し 」 と 間 違 っ て 解 釈 さ れ て い た 。 Linux 2.6.17 以 降 で は 、 リ ミ ッ ト を 0 に 設 定 し た 場 合 に も 効 果 を 持 つ よ う に な っ て い る が 、 実 際 に は リ ミ ッ ト の 値 は 1 秒 と な る 。 カ ー ネ ル 2.6.12 に は 、 RLIMIT_RTPRIO が 動 作 し な い と い う バ グ が あ る 。 こ の 問 題 は カ ー ネ ル 2.6.13 で 修 正 さ れ て い る 。 カ ー ネ ル 2.6.12 で は 、 getpriority(2) と RLIMIT_NICE が 返 す 優 先 度 の 範 囲 が 一 つ ず れ て い た 。 こ の た め 、 nice 値 の 実 際 の 上 限 が 19 − rlim_cur に な っ て し ま う と い う 影 響 が あ っ た 。 こ れ は カ ー ネ ル 2.6.13 で 修 正 さ れ た 。
Linux 2.6.12 以 降 で は 、 プ ロ セ ス が そ の RLIMIT_CPU ソ フ ト リ ミ ッ ト に 達 し 、 SIGXCPU に 対 し て シ グ ナ ル ハ ン ド ラ ー が 設 定 さ れ て い る 場 合 、 シ グ ナ ル ハ ン ド ラ ー を 起 動 す る だ け で な く 、 カ ー ネ ル は 1 秒 間 ソ フ ト リ ミ ッ ト を 増 や す 。 そ の プ ロ セ ス が CPU 時 間 を 消 費 し 続 け て い る 限 り 、 ハ ー ド リ ミ ッ ト に 達 す る ま で 、 こ の 動 作 が 繰 り 返 さ れ る 。 ハ ー ド リ ミ ッ ト に 達 す る と 、 そ の 時 点 で プ ロ セ ス は kill さ れ る 。 他 の 実 装 で は 、 上 記 の よ う な RLIMIT_CPU ソ フ ト リ ミ ッ ト の 変 更 は 行 わ れ ず 、 お そ ら く Linux の 動 作 は 標 準 に 準 拠 し て い な い 。 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の Linux 固 有 の 動 作 を 前 提 に す る の は 避 け る べ き で あ る 。 Linux 固 有 の 上 限 RLIMIT_RTTIME で も 、 ソ フ ト リ ミ ッ ト に 達 し た 場 合 に 同 じ 動 作 と な る 。
2.4.22 よ り 前 の カ ー ネ ル で は 、 rlim−>rlim_cur が rlim−>rlim_max よ り 大 き か っ た 場 合 、 setrlimit() で の EINVAL エ ラ ー を 検 出 で き な い 。
32 ビ
ッ ト プ ラ ッ ト
フ ォ ー ム に お
け る 「 大 き な
」 リ ソ ー ス 上
限 値 の 表 現
glibc の getrlimit() と
setrlimit() ラ ッ パ ー
関 数 は 、 32 ビ ッ
ト プ ラ ッ ト フ
ォ ー ム で あ っ
て も 64 ビ ッ ト の
rlim_t デ ー タ 型 を
使 用 す る 。 し
か し 、 getrlimit() と
setrlimit() シ ス テ ム
コ ー ル で 使 用
さ れ る rlim_t デ ー
タ 型 は (32 ビ ッ ト
の ) unsigned long で あ る
。 さ ら に 、 2.6.36 よ
り 前 の Linux で は 、
カ ー ネ ル は 32 ビ
ッ ト プ ラ ッ ト
フ ォ ー ム で は
リ ソ ー ス 上 限
を unsigned long と し て
表 現 し て い る
。 し か し な が
ら 、 32 ビ ッ ト デ
ー タ 型 は 十 分
な 大 き さ で は
な い 。 こ こ で
最 も 関 係 が あ
る 上 限 値 は
RLIMIT_FSIZE で あ る 。
こ の 上 限 は フ
ァ イ ル サ イ ズ
の 最 大 値 で あ
り 、 実 用 性 の
面 か ら は 、 こ
の 上 限 を フ ァ
イ ル オ フ セ ッ
ト を 表 現 す る
の に 使 用 さ れ
て い る 型 、 つ
ま り 64 ビ ッ ト の
off_t (_FILE_OFFSET_BITS=64 で コ
ン パ イ ル し た
プ ロ グ ラ ム の
場 合 )、 と 同 じ
幅 を 持 つ 型 、
を 使 っ て 表 現
す べ き で あ る
。 カ ー ネ ル の
こ の 制 限 に 対
す る 対 策 と し
て 、 プ ロ グ ラ
ム が リ ソ ー ス
上 限 を 32 ビ ッ ト
の unsigned long で 表 現
で き る 値 よ り
も 大 き な 値 に
設 定 し よ う と
し た 際 に は 、 glibc
の setrlimit() ラ ッ パ
ー 関 数 は こ の
上 限 値 を 黙 っ
て RLIM_INFINITY に 変 換
し て い た 。 言
い 換 え る と 、
指 定 さ れ た リ
ソ ー ス 上 限 値
は 黙 っ て 無 視
さ れ て い た 。
こ の 問 題 は Linux 2.6.36
で の 以 下 の 主
な 変 更 に よ り
解 決 さ れ た 。
* |
32 ビ ッ ト プ ラ ッ ト フ ォ ー ム で あ っ て も 64 ビ ッ ト を 使 用 す る リ ソ ー ス 上 限 の 新 し い カ ー ネ ル で の 表 現 方 法 の 追 加 。 リ ソ ー ス 上 限 の 引 き 数 と し て 64 ビ ッ ト 値 を 取 る prlimit() シ ス テ ム コ ー ル の 追 加 。 バ ー ジ ョ ン 2.13 以 降 の glibc で は 、 getrlimit() と setrlimit() シ ス テ ム コ ー ル の 制 限 に 対 す る 回 避 手 段 と し て 、 setrlimit() と getrlimit() を prlimit() を 呼 び 出 す ラ ッ パ ー 関 数 と し て 実 装 し て い る 。 例以 下 の プ ロ グ ラ ム に prlimit() の 使 用 例 を 示 す 。 #define
_GNU_SOURCE
while (0) int if (!(argc == 2
|| argc == 4)) { pid = atoi(argv[1]); /* PID of target process */ newp = NULL;
/* Set CPU time
limit of target process; retrieve and display if
(prlimit(pid, RLIMIT_CPU, newp, &old) == −1) /* Retrieve and display new CPU time limit */ if
(prlimit(pid, RLIMIT_CPU, NULL, &old) == −1) exit(EXIT_FAILURE); } 関 連 項 目prlimit(1), dup(2), fcntl(2), fork(2), getrusage(2), mlock(2), mmap(2), open(2), quotactl(2), sbrk(2), shmctl(2), malloc(3), sigqueue(3), ulimit(3), core(5), capabilities(7), signal(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |