OSDN Git Service

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