GETRLIMIT(2) | FreeBSD System Calls Manual | GETRLIMIT(2) |
名称
getrlimit, setrlimit — 最大のシステムリソースの消費を制御するライブラリ
Standard C Library (libc, -lc)書式
#include < sys/types.h>#include < sys/time.h>
#include < sys/resource.h>
int
getrlimit( int resource, struct rlimit *rlp);
int
setrlimit( int resource, const struct rlimit *rlp);
解説
現在のプロセスとそれが作成する各プロセスによるシステムリソースの消費の制限は、 getrlimit() システムコールで取得され、 setrlimit() システムコールで設定します。resource 引数は、次のうちの 1 つです:
- RLIMIT_AS
- プロセスがマップすることを許可される仮想メモリの (バイト単位の) 最大量。
- RLIMIT_CORE
- 作成される core(5) ファイルの (バイト単位の) 最大サイズ。
- RLIMIT_CPU
- 各プロセスによって使用される (秒単位の) CPU 時間の最大量。
- RLIMIT_DATA
- プロセスのためのデータセグメントの (バイト単位の) 最大サイズ。これは、プログラムがそのブレークを sbrk(2) 関数でどのくらい遠くまで延長できるかを定義します。
- RLIMIT_FSIZE
- 作成できるファイルの最大サイズ (バイト単位)。
- RLIMIT_MEMLOCK
- プロセスが mlock(2) システムコールを使用して、プロセスをメモリにロックできる最大サイズ (バイト単位)。
- RLIMIT_NOFILE
- このプロセスでオープンされるファイルの最大数。
- RLIMIT_NPROC
- このユーザ ID が同時に利用できるプロセスの最大数。
- RLIMIT_RSS
- 増加させて良いプロセスの常駐セットサイズの最大サイズ (バイト単位)。これは、プロセスに与えられる物理メモリの量に制限を課します。メモリが逼迫してシステムがメモリを回収する際に、宣言された常駐セットサイズを越えるプロセスを回収対象として選択します。
- RLIMIT_SBSIZE
- このユーザが使用できるソケットバッファの最大サイズ (バイト単位)。このサイズは、ユーザがいつでも保持できるネットワークメモリ量を制限します。したがって mbuf の使用量も制限されます。
- RLIMIT_STACK
- プロセスのスタックセグメントの最大サイズ (バイト数)。これによって、プログラムのスタックセグメントをどのくらい延長できるか定義できます。スタック延長は、システムによって自動的に実行されます。
- RLIMIT_SWAP
- このユーザ ID のプロセスのすべてによって、予約されるか、または使用されるスワップ空間の (バイト単位の) 最大サイズ。この制限は、 vm.overcommit sysctl のビット 1 が設定される場合にだけ、強行されます。この sysctl の完全な説明については、 tuning(7) を参照してください。
- RLIMIT_NPTS
- このユーザ ID によって作成された疑似端末の最大数。
リソースリミットは、ソフトリミットおよびハードリミットとして指定されます。ソフトリミットを越えた場合、プロセスは、シグナルを受信する可能性があります (例えば、CPU 時間またはファイルサイズを越えた場合) が、ハードリミットに到達する (またはリソースリミットを修正する) まで実行を継続することはできます。 rlimit 構造体を使用してリソースのハードリミットとソフトリミットを指定できます。
struct rlimit { rlim_t rlim_cur; /* 現在の (ソフト) リミット */ rlim_t rlim_max; /* rlim_cur の最大値 */ };
スーパユーザだけがリミットの最大値を大きくできます。他のユーザは 0 から rlim_max の範囲内で rlim_cur を変更するか、または rlim_max を下げられるだけです (撤回はできません)。
リミットを“無制限”にする値は、 RLIM_INFINITY として定義されます。
この情報は、プロセスごとの情報に保存されるので、シェルが将来作成するすべてのプロセスにこのシステムコールが影響を及ぼすためには、このシステムコールをシェルが直接実行する必要があります。このため limit は csh(1) の組み込みコマンドになっているのです。
システムは、通常の方法でリミットを超えようとするときに、データまたはスタック空間を延長することを拒絶します。データ空間リミットに到達すると brk(2) 関数は、処理に失敗します。スタックリミットに到達すると、プロセスは、セグメント例外 ( SIGSEGV) を受信します。シグナルスタックを使用するハンドラによってこのシグナルが捕捉されない場合、このシグナルは、プロセスを抹消します。
プロセスのソフトリミットより大きなファイルを作成するファイルの入出力操作をすると書み込みは、失敗し、シグナル SIGXFSZ が生成されます。通常、これによってプロセスは、終了しますが、捕捉することもできます。 CPU 時間のソフトリミットを越えたとき、シグナル SIGXCPU が障害を起こしているプロセスに送信されます。
戻り値
Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.エラー
getrlimit() と setrlimit() システムコールは、次の場合に失敗します:- [ EFAULT]
- rlp で指定したアドレスが不正です。
- [ EPERM]
- setrlimit() に指定されたリミットがリミットの最大値を上昇させようとしましたが、呼び出し側が、スーパユーザではありません。
歴史
getrlimit() システムコールは、 4.2BSD で登場しました。August 20, 2008 | FreeBSD |