Manpages

名 前

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;
/* メ ッ セ ー ジ デ ー タ 分 */ こ こ で attrmq_attr 構 造 体 で あ り 、 mq_open(3) の 第 4 引 き 数 と し て 指 定 さ れ る 。 ま た 、 構 造 体 msg_msgposix_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_ADMINCAP_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_currlim−>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_MEMLOCKRLIMIT_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 リ ミ ッ ト に 達 し た 場 合 に 送 ら れ る SIGXCPUSIGKILL シ グ ナ ル が 、 本 来 送 ら れ る べ き 時 点 の 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_currlim−>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
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>

#define errExit(msg)

do { perror(msg); exit(EXIT_FAILURE); \ }

while (0)

int
main(int argc, char *argv[])
{
struct rlimit old, new;
struct rlimit *newp;
pid_t pid;

if (!(argc == 2 || argc == 4)) {
fprintf(stderr, "Usage: %s <pid> [<new−soft−limit> "
"<new−hard−limit>]\n", argv[0]);
exit(EXIT_FAILURE); }

pid = atoi(argv[1]); /* PID of target process */

newp = NULL;
if (argc == 4) {
new.rlim_cur = atoi(argv[2]);
new.rlim_max = atoi(argv[3]);
newp = &new; }

/* Set CPU time limit of target process; retrieve and display
previous limit */

if (prlimit(pid, RLIMIT_CPU, newp, &old) == −1)
errExit("prlimit−1");
printf("Previous limits: soft=%lld; hard=%lld\n",
(long long) old.rlim_cur, (long long) old.rlim_max);

/* Retrieve and display new CPU time limit */

if (prlimit(pid, RLIMIT_CPU, NULL, &old) == −1)
errExit("prlimit−2");
printf("New limits: soft=%lld; hard=%lld\n",
(long long) old.rlim_cur, (long long) old.rlim_max);

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