1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
|
.\" Copyright (c) 1992 Drew Eckhardt, March 28, 1992
.\" and Copyright (c) 2002, 2004, 2005, 2008, 2010 Michael Kerrisk
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date. The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein. The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 1993-07-23 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1996-01-13 by Arnt Gulbrandsen <agulbra@troll.no>
.\" Modified 1996-01-22 by aeb, following a remark by
.\" Tigran Aivazian <tigran@sco.com>
.\" Modified 1996-04-14 by aeb, following a remark by
.\" Robert Bihlmeyer <robbe@orcus.ping.at>
.\" Modified 1996-10-22 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified 2001-05-04 by aeb, following a remark by
.\" Håvard Lygre <hklygre@online.no>
.\" Modified 2001-04-17 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Modified 2002-06-13 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Added note on nonstandard behavior when SIGCHLD is ignored.
.\" Modified 2002-07-09 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Enhanced descriptions of 'resource' values
.\" Modified 2003-11-28 by aeb, added RLIMIT_CORE
.\" Modified 2004-03-26 by aeb, added RLIMIT_AS
.\" Modified 2004-06-16 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Added notes on CAP_SYS_RESOURCE
.\"
.\" 2004-11-16 -- mtk: the getrlimit.2 page, which formally included
.\" coverage of getrusage(2), has been split, so that the latter
.\" is now covered in its own getrusage.2.
.\"
.\" Modified 2004-11-16, mtk: A few other minor changes
.\" Modified 2004-11-23, mtk
.\" Added notes on RLIMIT_MEMLOCK, RLIMIT_NPROC, and RLIMIT_RSS
.\" to "CONFORMING TO"
.\" Modified 2004-11-25, mtk
.\" Rewrote discussion on RLIMIT_MEMLOCK to incorporate kernel
.\" 2.6.9 changes.
.\" Added note on RLIMIT_CPU error in older kernels
.\" 2004-11-03, mtk, Added RLIMIT_SIGPENDING
.\" 2005-07-13, mtk, documented RLIMIT_MSGQUEUE limit.
.\" 2005-07-28, mtk, Added descriptions of RLIMIT_NICE and RLIMIT_RTPRIO
.\" 2008-05-07, mtk / Peter Zijlstra, Added description of RLIMIT_RTTIME
.\" 2010-11-06, mtk: Added documentation of prlimit()
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya
.\" all rights reserved.
.\" Translated 1997-02-22, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
.\" Updated and Modified 2001-06-02, Yuichi SATO <ysato444@yahoo.co.jp>
.\" Updated and Modified 2001-08-18, Yuichi SATO
.\" Updated and Modified 2002-08-25, Yuichi SATO
.\" Updated and Modified 2004-01-17, Yuichi SATO
.\" Updated and Modified 2004-12-30, Yuichi SATO
.\" Updated and Modified 2005-09-10, Yuichi SATO
.\" Updated and Modified 2005-10-11, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
.\" Updated and Modified 2005-10-27, Akihiro MOTOKI
.\" Updated and Modified 2006-04-15, Akihiro MOTOKI, Catch up to LDP v2.29
.\" Updated 2008-08-08, Akihiro MOTOKI, LDP v3.05
.\" Updated 2008-10-13, Akihiro MOTOKI, LDP v3.11
.\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-07-22, Akihiro MOTOKI <amotoki@gmail.com>
.\"
.TH GETRLIMIT 2 2014\-01\-22 Linux "Linux Programmer's Manual"
.SH 名前
getrlimit, setrlimit, prlimit \- 資源の制限を取得/設定する
.SH 書式
\fB#include <sys/time.h>\fP
.br
\fB#include <sys/resource.h>\fP
.sp
\fBint getrlimit(int \fP\fIresource\fP\fB, struct rlimit *\fP\fIrlim\fP\fB);\fP
.br
\fBint setrlimit(int \fP\fIresource\fP\fB, const struct rlimit *\fP\fIrlim\fP\fB);\fP
.sp
\fBint prlimit(pid_t \fP\fIpid\fP\fB, int \fP\fIresource\fP\fB, const struct rlimit
*\fP\fInew_limit\fP\fB,\fP
.br
\fB struct rlimit *\fP\fIold_limit\fP\fB);\fP
.sp
.in -4n
glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
.in
.sp
\fBprlimit\fP(): _GNU_SOURCE && _FILE_OFFSET_BITS == 64
.SH 説明
\fBgetrlimit\fP() と \fBsetrlimit\fP() はそれぞれ資源 (resource) の制限
(limit) の設定と取得を行う。 各リソースには、それに対応するソフトリミッ
トとハードリミットがあり、 \fIrlimit\fP 構造体で定義される:
.PP
.in +4n
.nf
struct rlimit {
rlim_t rlim_cur; /* ソフトリミット */
rlim_t rlim_max; /* ハードリミット
(rlim_cur より小さくない) */
};
.fi
.in
ソフトリミットは、カーネルが対応するリソースに対して課す制限値である。 ハードリミットはソフトリミットの上限として働く。
特権を持たないプロセスは、ソフトリミットの値を 0 からハードリミットの範囲に設定することと、 ハードリミットを下げることのみができる
(一度下げたハードリミットは上げられない)。 特権プロセス (Linux では \fBCAP_SYS_RESOURCE\fP ケーパビリティ
(capability) を持つプロセス) は ソフトリミットとハードリミットを自由に変更できる。
.PP
値 \fBRLIM_INFINITY\fP はリソースに制限がないことを表す (この値は \fBgetrlimit\fP() が返す構造体と
\fBsetrlimit\fP() に渡す構造体の両方で使用される)。
.PP
\fIresource\fP 引き数は次のいずれか 1 つである。
.TP
\fBRLIMIT_AS\fP
.\" since 2.0.27 / 2.1.12
プロセスの仮想メモリ (アドレス空間) の最大サイズ (バイト単位)。 この制限は \fBbrk\fP(2), \fBmmap\fP(2),
\fBmremap\fP(2) の呼び出しに影響し、この制限を超えた場合は エラー \fBENOMEM\fP で失敗する。 また自動的なスタック拡張にも失敗する
(さらに \fBsigaltstack\fP(2) を使った代替スタックを利用可能にしていなかった場合には、 \fBSIGSEGV\fP を生成してそのプロセスを
kill する)。 この値は \fIlong\fP 型なので、32 ビットの \fIlong\fP 型を持つマシンでは、 この制限は最大で 2 GiB
になるか、この資源が無制限になる。
.TP
\fBRLIMIT_CORE\fP
\fIcore\fP ファイルの最大サイズ。 0 の場合、core ファイルは生成されない。 0 以外の場合、このサイズより大きいダンプは切り詰められる。
.TP
\fBRLIMIT_CPU\fP
CPU 時間の上限 (秒数)。プロセスがソフトリミットに達した場合に、
\fBSIGXCPU\fP シグナルを送る。このシグナルに対するデフォルトの動作は、
プロセスの終了である。ただし、シグナルをキャッチして、ハンドラがメイン
プログラムに制御を返すこともできる。プロセスが CPU 時間を使い続けた
場合は、ハードリミットに達するまで 1 秒毎にプロセスに \fBSIGXCPU\fP を送り、
ハードリミットに達すると \fBSIGKILL\fP を送る。
(ソフトリミットを超過したときの動作は、 Linux における動作である。ソフ
トリミットを超えて CPU 時間を使い続けるプロセスの扱い方についての実装は
変化してきている。 このシグナルをキャッチする必要のある 移植性を考えた
アプリケーションでは、 最初に \fBSIGXCPU\fP を受け取った時点で正しく終了
すべきである。)
.TP
\fBRLIMIT_DATA\fP
プロセスのデータセグメント (初期化されたデータ・初期化されていないデータ・ヒープ) の最大値。 このリミットは \fBbrk\fP(2) と
\fBsbrk\fP(2) の呼び出しに影響する。 これらの関数は、このリソースのソフトリミットに達すると、 エラー \fBENOMEM\fP で失敗する。
.TP
\fBRLIMIT_FSIZE\fP
プロセスが作成できるファイルサイズの最大値。 このサイズを超えてファイルを拡張すると、 \fBSIGXFSZ\fP シグナルを送る。
デフォルトでは、このシグナルはプロセスを終了する。 プロセスをキャッチすることもできるが、 関連するシステムコール (\fBwrite\fP(2),
\fBtruncate\fP(2) など) はエラー \fBEFBIG\fP で失敗する。
.TP
\fBRLIMIT_LOCKS\fP (初期の Linux 2.4 のみ)
.\" to be precise: Linux 2.4.0-test9; no longer in 2.4.25 / 2.5.65
このプロセスが実行できる \fBflock\fP(2) ロック数と \fBfcntl\fP(2) リース数の合計値を制限する。
.TP
\fBRLIMIT_MEMLOCK\fP
RAM 内にロックできるメモリの最大バイト数。 実際には、この制限はシステムページサイズの最も近い倍数に 切り捨てて丸められる。 この制限は
\fBmlock\fP(2), \fBmlockall\fP(2), \fBmmap\fP(2) の \fBMAP_LOCKED\fP 操作に影響する。 Linux
2.6.9 以降では \fBshmctl\fP(2) \fBSHM_LOCK\fP 操作にも影響する。 この操作は呼び出し元プロセスの実 (real) ユーザー
ID にロックされる 共有メモリセグメント (\fBshmget\fP(2) を参照) の合計バイト数の最大値を設定する。 \fBshmctl\fP(2)
\fBSHM_LOCK\fP によるロックは、 \fBmlock\fP(2), \fBmlockall\fP(2), \fBmmap\fP(2) の
\fBMAP_LOCKED\fP によって確立されるプロセス毎のメモリロックとは分けて数える。 1 つのプロセスはこの制限までのバイトをロックできる。
この制限には 2 つの種類がある。 2.6.9 より前の Linux カーネル では、
この制限は特権プロセスによってロックされるメモリの合計を制御していた。 Linux 2.6.9
以降では、特権プロセスがロックするメモリの合計に制限はなく、 代わりにこの制限は非特権プロセスがロックするメモリの合計に 適用されるようになった。
.TP
\fBRLIMIT_MSGQUEUE\fP (Linux 2.6.8 以降)
呼び出し元プロセスの実ユーザー ID に対して、 POSIX メッセージキューのために確保できるバイト数の制限を指定する。 この制限は
\fBmq_open\fP(3) に対して適用される。 ユーザが作成した各々のメッセージキューのバイト数は
以下の式により計算され、(そのキューが削除されるまでの間) この制限の計算対象に含められる。
.nf
bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) +
attr.mq_maxmsg * attr.mq_msgsize
.fi
ここで \fIattr\fP は \fImq_attr\fP 構造体であり、 \fBmq_open\fP(3) の第 4 引き数として指定される。
\fIsizeof(struct msg_msg\ *)\fP (Linux/i386 では 4 バイト) を含む最初の加数は、 ユーザーが長さ 0
のメッセージを無制限に作れないこと保証している (このようなメッセージであっても、 記録のためのオーバーヘッドでシステムメモリを消費する)。
.TP
\fBRLIMIT_NICE\fP (Linux 2.6.12 以降, 下記の「バグ」の節も参照)
\fBsetpriority\fP(2) や \fBnice\fP(2) を使って引き上げられるプロセスの nice 値の上限を指定する。 nice
値の実際の上限は \fI20\ \-\ rlim_cur\fP で計算される (このような変な状況は、リソース制限値として負の数を指定できないため
発生する。通常、負の値は特別な意味を持っているからである。 例えば、通常は \fBRLIM_INFINITY\fP の値は \-1 である)。
.TP
\fBRLIMIT_NOFILE\fP
このプロセスがオープンできるファイルディスクリプタ数の最大値より 1 大きい値を指定する。 (\fBopen\fP(2), \fBpipe\fP(2),
\fBdup\fP(2) などにより) この上限を超えようとした場合、エラー \fBEMFILE\fP が発生する (歴史的に、BSD ではこの上限は
\fBRLIMIT_OFILE\fP という名前となっている)。
.TP
\fBRLIMIT_NPROC\fP
呼び出したプロセスの実ユーザー ID で作成できる最大プロセス数 (より正確には Linux ではスレッド数)。 この上限に達すると、
\fBfork\fP(2) はエラー \fBEAGAIN\fP で失敗する。
.TP
\fBRLIMIT_RSS\fP
.\" As at kernel 2.6.12, this limit still does nothing in 2.6 though
.\" talk of making it do something has surfaced from time to time in LKML
.\" -- MTK, Jul 05
プロセスの resident set (RAM 上に存在する仮想ページの数) の 上限を (ページ数で) 指定する。 この制限は 2.4.30
より前でしか影響がなく、 \fBmadvise\fP(2) に \fBMADV_WILLNEED\fP を指定した関数コールにしか影響しない。
.TP
\fBRLIMIT_RTPRIO\fP (Linux 2.6.12 以降, バグの節も参照)
\fBsched_setscheduler\fP(2) や \fBsched_setparam\fP(2)
を使って設定できる、そのプロセスのリアルタイム優先度の上限を指定する。
.TP
\fBRLIMIT_RTTIME\fP (Linux 2.6.25 以降)
リアルタイムスケジューリング方針でスケジューリングされるプロセスが ブロッキング型のシステムコールを呼び出さずに消費することのできる CPU
時間の合計についての上限を (マイクロ秒単位で) 指定する。 この上限の目的のため、プロセスがブロッキング型のシステムコールを 呼び出す度に、消費された
CPU 時間のカウントは 0 にリセットされる。 プロセスが CPU を使い続けようとしたが他のプロセスに置き換えられた (preempted)
場合や、そのプロセスのタイムスライスが満了した場合、 そのプロセスが \fBsched_yield\fP(2) を呼び出した場合は、CPU
時間のカウントはリセットされない。
ソフトリミットに達すると、そのプロセスに \fBSIGXCPU\fP シグナルが送られる。そのプロセスがこのシグナルを捕捉するか 無視して、CPU
時間を消費し続けた場合には、 ハードリミットに達するまで 1 秒に 1 回 \fBSIGXCPU\fP が生成され続けることになる。
ハードリミットに達した時点で、そのプロセスには \fBSIGKILL\fP シグナルが送られる。
この上限を意図的に使用するのは、暴走したリアルタイムプロセスを 停止して、システムが動かなくなるのを避ける場合である。
.TP
\fBRLIMIT_SIGPENDING\fP (Linux 2.6.8 以降)
.\" This replaces the /proc/sys/kernel/rtsig-max system-wide limit
.\" that was present in kernels <= 2.6.7. MTK Dec 04
呼び出し元プロセスの実ユーザー ID に対して キューに入れられるシグナルの
数の制限を指定する。この制限をチェックするため、標準シグナルとリアルタ
イムシグナルの両方がカウントされる。しかし、この制限は \fBsigqueue\fP(3)
に対してのみ適用され、 \fBkill\fP(2) 使うことで、そのプロセスに対してま
だキューに入れられていない シグナルのインスタンスをキューに入れることが
できる。
.TP
\fBRLIMIT_STACK\fP
プロセススタックの最大サイズをバイト単位で指定する。 この上限に達すると、 \fBSIGSEGV\fP シグナルが生成される。 このシグナルを扱うためには、
プロセスは代りのシグナルスタック (\fBsigaltstack\fP(2)) を使用しなければならない。
Linux 2.6.23 以降では、この制限はプロセスのコマンドライン引き数と環境変数
に使用される空間の合計サイズの上限の決定にも使用される。詳細については \fBexecve\fP(2) を参照。
.SS prlimit()
.\" commit c022a0acad534fd5f5d5f17280f6d4d135e74e81
.\" Author: Jiri Slaby <jslaby@suse.cz>
.\" Date: Tue May 4 18:03:50 2010 +0200
Linux 固有の \fBprlimit\fP() システムコールは、 \fBsetrlimit\fP() と \fBgetrlimit\fP
の機能を合わせて拡張したものである。 このシステムコールを使って、任意のプロセスのリソース上限の設定と取得を行うことができる。
\fIresource\fP 引き数は \fBsetrlimit\fP() や \fBgetrlimit\fP() と同じ意味である。
\fInew_limit\fP 引き数が NULL 以外の場合、 \fInew_limit\fP が指す \fIrlimit\fP 構造体を使って \fIresource\fP
のソフトリミットとハードリミットの新しい値が設定される。 \fIold_limit\fP 引き数が NULL 以外の場合、 \fBprlimit\fP()
の呼び出しが成功すると、 \fIresource\fP の直前のソフトリミットとハードリミットが \fIold_limit\fP が指す \fIrlimit\fP
構造体に格納される。
.\" FIXME this permission check is strange
.\" Asked about this on LKML, 7 Nov 2010
.\" "Inconsistent credential checking in prlimit() syscall"
\fIpid\fP 引き数は呼び出しの操作対象となるプロセス ID を指定する。 \fIpid\fP が 0
の場合、呼び出しは呼び出し元プロセスに対して適用される。 自分以外のプロセスのリソースの設定と取得を行うためには、 呼び出し元プロセスが
\fBCAP_SYS_RESOURCE\fP ケーパビリティを持っているか、 対象となるプロセスの実ユーザ ID、 実効ユーザ ID、 保存
set\-user\-ID が呼び出し元プロセスの実ユーザ ID と一致し、 かつ、 対象となるプロセスの実グループ ID、 実効グループ ID、 保存
set\-group\-ID が呼び出し元プロセスの実グループ ID と一致していなければならない。
.SH 返り値
成功した場合、これらのシステムコールは 0 を返す。
エラーの場合は \-1 が返され、 \fIerrno\fP が適切に設定される。
.SH エラー
.TP
\fBEFAULT\fP
場所を指すポインタ引き数がアクセス可能なアドレス空間外を指している。
.TP
\fBEINVAL\fP
\fIresource\fP で指定された値が有効でない。
または、 \fBsetrlimit\fP() や \fBprlimit\fP() で、
\fIrlim\->rlim_cur\fP が \fIrlim\->rlim_max\fP よりも大きかった。
.TP
\fBEPERM\fP
特権のないプロセスがハードリミットを上げようとした。
これを行うためには \fBCAP_SYS_RESOURCE\fP ケーパビリティが必要である。
または、特権のないプロセスが \fBRLIMIT_NOFILE\fP ハードリミットを
現在のカーネルの最大値 (\fBNR_OPEN\fP) 以上に増やそうとした。
または、呼び出したプロセスが \fIpid\fP で指定されたプロセスのリミットを
設定する許可を持っていなかった。
.TP
\fBESRCH\fP
\fIpid\fP で指定された ID のプロセスが見つからなかった。
.SH バージョン
\fBprlimit\fP() システムコールは Linux 2.6.36 以降で利用できる。 ライブラリのサポートは glibc 2.13
以降で利用できる。
.SH 準拠
\fBgetrlimit\fP(), \fBsetrlimit\fP(): SVr4, 4.3BSD, POSIX.1\-2001.
.br
\fBprlimit\fP(): Linux 固有。
\fBRLIMIT_MEMLOCK\fP と \fBRLIMIT_NPROC\fP は BSD から派生し、
POSIX.1\-2001 には指定されていない。
これらは BSD 系と Linux に存在するが、他の実装は少ない。
\fBRLIMIT_RSS\fP は BSD から派生し、POSIX.1\-2001 には指定されていない。
それにも関わらず多くの実装で存在する。
\fBRLIMIT_MSGQUEUE\fP, \fBRLIMIT_NICE\fP, \fBRLIMIT_RTPRIO\fP, \fBRLIMIT_RTTIME\fP,
\fBRLIMIT_SIGPENDING\fP は Linux 固有のものである。
.SH 注意
\fBfork\fP(2) で作成された作成された子プロセスは、 親プロセスのリソース制限を継承する。 \fBexecve\fP(2)
の前後でリソース制限は保存される。
リソースのソフトリミットをそのプロセスが現在のリソース使用量より小さい値に設定することはできる
(但し、そのプロセスはそれ以降そのリソースの使用量を増やすことができなくなる)。
シェルのリソース制限は、シェルの組み込みコマンドである \fIulimit\fP (\fBcsh\fP(1) では \fIlimit )\fP
を使って設定することができる。 このシェルのリソース制限は、コマンドを実行してシェルが生成するプロセス に引き継がれる。
Linux 2.6.24 以降では、 プロセスのリソース上限は \fI/proc/[pid]/limits\fP で知ることができる。 \fBproc\fP(5)
参照。
古いシステムでは、 \fBsetrlimit\fP() と同様の目的を持つ関数 \fBvlimit\fP() が提供されていた。 後方互換性のため、glibc
でも \fBvlimit\fP() を提供している。 全ての新しいアプリケーションでは、 \fBsetrlimit\fP() を使用すべきである。
.SH バグ
.\" FIXME prlimit() does not suffer
.\" https://bugzilla.kernel.org/show_bug.cgi?id=5042
.\" http://sources.redhat.com/bugzilla/show_bug.cgi?id=12201
.\" Since versions 2.13, glibc has library implementations of
.\" getrlimit() and setrlimit() that use prlimit() to work around
.\" this bug.
以前の Linux カーネルでは、プロセスがソフトまたはハード \fBRLIMIT_CPU\fP リミットに達した場合に送られる \fBSIGXCPU\fP と
\fBSIGKILL\fP シグナルが、本来送られるべき時点の 1 (CPU) 秒後に送られてしまう。 これはカーネル 2.6.8 で修正された。
.\" see http://marc.theaimsgroup.com/?l=linux-kernel&m=114008066530167&w=2
2.6.17 より前の 2.6.x カーネルでは、 \fBRLIMIT_CPU\fP リミットが 0 の場合、 (\fBRLIM_INFINITY\fP
と同じように) 「制限なし」と間違って解釈されていた。 Linux 2.6.17 以降では、リミットを 0 に設定した場合にも
効果を持つようになっているが、実際にはリミットの値は 1 秒となる。
.\" See https://lwn.net/Articles/145008/
カーネル 2.6.12 には、 \fBRLIMIT_RTPRIO\fP が動作しないというバグがある。この問題はカーネル 2.6.13 で修正されている。
.\" see http://marc.theaimsgroup.com/?l=linux-kernel&m=112256338703880&w=2
カーネル 2.6.12 では、 \fBgetpriority\fP(2) と \fBRLIMIT_NICE\fP
が返す優先度の範囲が一つずれていた。このため、nice 値の実際の上限が \fI19\ \-\ rlim_cur\fP
になってしまうという影響があった。これはカーネル 2.6.13 で修正された。
.\" The relevant patch, sent to LKML, seems to be
.\" http://thread.gmane.org/gmane.linux.kernel/273462
.\" From: Roland McGrath <roland <at> redhat.com>
.\" Subject: [PATCH 7/7] make RLIMIT_CPU/SIGXCPU per-process
.\" Date: 2005-01-23 23:27:46 GMT
.\" Tested Solaris 10, FreeBSD 9, OpenBSD 5.0
.\" FIXME https://bugzilla.kernel.org/show_bug.cgi?id=50951
Linux 2.6.12 以降では、 プロセスがその \fBRLIMIT_CPU\fP ソフトリミットに達し、 \fBSIGXCPU\fP
に対してシグナルハンドラが設定されている場合、 シグナルハンドラを起動するだけでなく、 カーネルは 1 秒間ソフトリミットを増やす。 そのプロセスが
CPU 時間を消費し続けている限り、 ハードリミットに達するまで、この動作が繰り返される。 ハードリミットに達すると、その時点でプロセスは kill
される。 他の実装では、上記のような \fBRLIMIT_CPU\fP ソフトリミットの変更は行われず、 おそらく Linux の動作は標準に準拠していない。
移植性が必要なアプリケーションではこの Linux 固有の動作を前提にするのは避けるべきである。 Linux 固有の上限
\fBRLIMIT_RTTIME\fP でも、 ソフトリミットに達した場合に同じ動作となる。
2.4.22 より前のカーネルでは、 \fIrlim\->rlim_cur\fP が \fIrlim\->rlim_max\fP より大きかった場合、
\fBsetrlimit\fP() での \fBEINVAL\fP エラーを検出できない。
.SH 例
以下のプログラムに \fBprlimit\fP() の使用例を示す。
.PP
.nf
#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); \e
} 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>]\en", 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\en",
(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\en",
(long long) old.rlim_cur, (long long) old.rlim_max);
exit(EXIT_FAILURE);
}
.fi
.SH 関連項目
\fBprlimit\fP(1), \fBdup\fP(2), \fBfcntl\fP(2), \fBfork\fP(2), \fBgetrusage\fP(2),
\fBmlock\fP(2), \fBmmap\fP(2), \fBopen\fP(2), \fBquotactl\fP(2), \fBsbrk\fP(2),
\fBshmctl\fP(2), \fBmalloc\fP(3), \fBsigqueue\fP(3), \fBulimit\fP(3), \fBcore\fP(5),
\fBcapabilities\fP(7), \fBsignal\fP(7)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。
|