setrlimit() - 最大リソース使用量の制御

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/resource.h>

int setrlimit(int resource, const struct rlimit *rlp);

機能説明

setrlimit() 関数は、呼び出しプロセスにリソース限界を設定します。リソース限界は、値の対です。1 つは現行 (ソフト) 限界を指定するもので、他の 1 つは最大 (ハード) 限界を指定します。

ソフト限界は、ハード限界より小さいか等しい任意の値に変更することが できます。一定の resource 値、(RLIMIT_CPURLIMIT_NOFILERLIMIT_AS) の 場合には、ソフト限界は、既存の使用より低く設定することはできません。

ハード限界は、ソフト限界より大きいか等しい任意の値 に対し低く設定される場合があります。ハード限界を上げることができるのは、スーパーユーザー権限のある プロセスだけです。 ソフト限界とハード限界は、両方とも setrlimit() への 1 回の呼び出しで変更できます。

<sys/resource.h> で定義された値 RLIM_INFINITY は、他のどの限界値より大きいと見なされます。getrlimit() への呼び出しにより リソースの RLIM_INFINITY が戻される場合には、インプリメンテーションでそのリソースの限界が実施されない ことを意味しています。RLIM_INFINITY を、setrlimit() への正常呼び出し のリソース限界値として指定すると、そのリソース限界の実施が禁止されます。

resource 引数は、ハードまたはソフト限界 (あるいはその両方) に 設定されるリソースを指定し、次の値の 1 つにすることができます。
RLIMIT_CORE
プロセスに許可されるメモリーのダンプの最大サイズ (バイト数)。0 (ゼロ) の値では、ファイルを生成できません。ダンプ・ファイルの生成は、この限界で停止します。.
RLIMIT_CPU
プロセスに許可される最大 CPU 時間量 (秒)。この制限を超えると、SIGXCPU シグナルがプロセスへ送られ、CPU 時間が少し延長されてシグナル生成と送達が可能になります。延長時間を使い終わると、プロセスは SIGKILL シグナルを出して終了します。CPU 限界を既に使用されたものより低く設定しようとすると、EINVAL errno という結果になります。
RLIMIT_DATA
プロセスの中断値の最大サイズ (バイト数)。このインプリメンテーションでは、このリソースには 常に、RLIM_INFINITY のハードおよびソフト 限界値があります。このリソースを RLIM_INFINITY 以外 の任意の値に設定するための、setrlimit() への呼び出しは失敗して 、errno に EINVAL が設定されます。
RLIMIT_FSIZE
プロセスに許可された最大ファイル・サイズ (バイト数)。0 (ゼロ) の値では、ファイルを生成できません。サイズを超えると、SIGXFSZ シグナルがプロセスに送信されます。プロセスが SIGXFSZ をブロック、キャッチ、または無視している場合は、制限を超えるファイル・サイズの増加を継続しようとすると、errno に EFBIG を設定して失敗します。
RLIMIT_MEMLIMIT
割り振り可能な、2 ギガバイト境界を越える、使用可能ストレージの最大容量 (1 メガバイト・セグメント単位)。2 ギガバイト境界を超えた仮想ストレージの使用可能容量の拡張を試みると失敗します。
RLIMIT_NOFILE
プロセスに許可されるオープン・ファイル記述子の最大数。この数は、新規に作成された記述子に割り当てられる最大値より大きい値です (つまりこれは、基本が 1 つです)。新規ファイル記述子を、限界を超えて作成しようとする関数は、すべて失敗して、errno に EMFILE が設定されます。オープン・ファイル記述子限界を、既に使用されたものより低く設定しようと すると、EINVAL errno という結果になります。
制約事項: この値は、524288 を超えてはなりません。
RLIMIT_STACK
プロセスのスタックの最大サイズ (バイト数)。z/OS®UNIX サービス では、スタックはスレッドごとのリソースであることに注意する。このインプリメンテーションでは、このリソースには 常に、RLIM_INFINITY のハードおよびソフト 限界値があります。このリソースを RLIM_INFINITY 以外 の任意の値に設定するための、setrlimit() への呼び出しは失敗して 、errno に EINVAL が設定されます。
RLIMIT_AS
プロセスの最大アドレス・スペース・サイズ (バイト数)。限界を超えた場合には、malloc() および mmap() 関数は失敗して、errno に ENOMEM が設定されます。また、自動スタック増加が失敗します。
rlp 引数は、rlimit 構造体を指しています。この構造体には以下のメンバーが含まれています。
rlim_cur
現行 (ソフト) 限界
rlim_max
最大 (ハード) 限界

詳細は、<sys/resource.h> ヘッダーの説明を参照してください。

リソース限界値は、exec および fork に伝えられます。

z/OSUNIX サービスの特殊な動作: 例外は、デーモン・サポートを受けて exec 処理を行うときのために存在します。 デーモン・プロセスが exec を呼び出し、それが以前に exec に対して setuid() を呼び出していた場合、RLIMIT_CPURLIMIT_ASRLIMIT_CORERLIMIT_FSIZE、および RLIMIT_NOFILE 制限値は、カーネル parmlib メンバー BPXPRMxx 内で指 定された制限値を基に設定されます。

アドレス・スペース内の唯一のプロセス以外のプロセスの場合には 、RLIMIT_CPU および RLIMIT_AS 限界が、アドレス・スペース内のすべてのプロセスと共用されます。RLIMIT_CPU の場合、ソフト限界を超えると、アドレス・スペース内の最初のプロセスで処置がとられます。処置が終了すると、アドレス・スペース内のすべてのプロセスが終了します。

RLIMIT_CORE 限界値に加えて、ダンプ・ファイル・デフォルト値 には SYSMDUMP デフォルト値が設定されます。IEADMR00 parmlib メンバーを利用した SYSMDUMP デフォルトの設定については、「z/OS MVS 初期設定およびチューニング 解説書 」を参照してください。

メモリー・ダンプの増分単位は、4160 バイトです。したがって、RLIMIT_CORE 値は、メモリー・ダンプのサイズに 4160 バイトを増分単位とし て影響を与えます。例えば、RLIMIT_CORE ソフト限界値が 4000 の 場合には、ダンプにはデータが含まれません。RLIMIT_CORE ソフト限界値が 8000 の場合、メモリー・ダンプの最大サイズは 4160 バイトです。

RLIMIT_NOFILE の設定時には、ハード限界は、システム定義限界 の 524288 を超えられません。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

正常に実行された場合、setrlimit() は 0 を戻します。

正常に実行されなかった場合、setrlimit() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
無効 resource が指定されたか、または設定する ソフト限界が、設定するハード限界を超え、設定するソフト限界が 現在の使用より低いか、あるいはリソースで RLIM_INFINITY 以外の値が許可されていません。
EPERM
setrlimit() に指定された限界値により、最大限界値が引き上げられた 可能性があります。また、呼び出しプロセスに該当する特権がありません。

関連情報