GETRLIMIT(2)

名称
getrlimit, setrlimit - 最大システムリソース消費を制御する

ライブラリ
libc

書式
<sys/types.h> <sys/time.h> <sys/resource.h> int getrlimit(int resource, struct rlimit *rlp) int setrlimit(int resource, const struct rlimit *rlp)

解説
現在のプロセス、およびそれが作成する各プロセスによるシステムリソースの 消費限度は、 getrlimit() 呼び出しで取得することができ、 setrlimit() 呼び出しで設定できます。

resource パラメータは次のうちの 1 つです:

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_STACK
    プロセスのスタックセグメントの最大サイズ (バイト数)。 これによって、 プログラムのスタックセグメントをどのくらい延長できるか定義できます。 スタック延長はシステムによって自動的に実行されます。

RLIMIT_SBSIZE
    このユーザが使用できるソケットバッファの最大サイズ (バイト単位)。 このサイズは、ユーザがいつでも保持できるネットワークメモリ量を 制限します。 したがって mbuf の使用量も制限されます。

リソースリミットはソフトリミットおよびハードリミットとして指定されます。 ソフトリミットを越えた場合、プロセスはシグナルを受信する可能性があります (例えば、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 が障害を起こしているプロセスに送信されます。

戻り値

エラー
getrlimit() および setrlimit() は次の場合に失敗します:

[EFAULT]
    rlp で指定したアドレスが不正です。

[EPERM]
    setrlimit() に指定されたリミットがリミットの最大値を上昇させようとしましたが、 呼び出し側はスーパユーザではありません。

関連項目
csh(1), quota(1), quotactl(2), sigaltstack(2), sigvec(2), sysctl(3), ulimit(3)

歴史
getrlimit() 関数は 4.2BSD ではじめて登場しました。