名称
getrlimit(), setrlimit() ― システムリソースの消費の制御
構文
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
int setrlimit(int resource, const struct rlimit *rlp);
説明
呼び出し側のプロセスの各種リソースの消費の制限を、取得 (getrlimit())、
設定 (setrlimit()) します。 getrlimit() または setrlimit() の呼び出しごとに、リソースの制限の他に操作対象のリソースを検証します。リソースの制限は、引き数 rlp が指す rlimit 構造体で示されます。この構造体には、次に示すメンバーが含まれています。
rlim_t rlim_cur; /* Current (soft) limit */
rlim_t rlim_max; /* Hard limit */
メンバー rlim_cur は、現在の制限すなわち論理制限を示し、
メンバー rlim_max は最大限度すなわち物理制限を示します。
論理制限は、物理制限以下の任意の値に変更できます。 物理制限は、論理制限以上の任意の値まで小さくすることができますが、大きくすることはできません。
適切な特権を持ったプロセスだけが物理制限を大きくすることができます。
物理制限と論理制限は、上記の制約を満たしている限り、 setrlimit() を 1 回呼び出すだけで変更できます。
<sys/resource.h> で定義されている RLIM_INFINITY 値は、他のどの制限値よりも大きくなるように設定されています。 getrlimit() を呼び出したときに、あるリソースに対して RLIM_INFINITY が返却された場合は、そのリソースに対して制限を設けないようにインプリメントされていることを表します。 RLIM_INFINITY を任意のリソースの制限値として指定して、 setrlimit() の呼び出しが正常終了した場合は、そのリソースの制限の設定は抑制されます。
次のリソースが定義されています。
| RLIMIT_CORE | | プロセスが作成できるコアファイルの最大サイズ (バイト単位)
です。 0 を指定すると、コアファイルは作成されません。 指定したサイズを超えた場合は、コアファイルの書き込みはこのサイズまでで終了します。 |
| RLIMIT_CPU | | これは、UNIX 95 に適合したアプリケーションに許される秒単位の CPU
時間の最大値です。 この制限を超えた場合は、 SIGXCPU がそのアプリケーションに対して生成されます。
UNIX 95 に適合したアプリケーションのデフォルトのアクションによって、
プロセスが kill され、コアファイルが作成されます。 UNIX 95 標準では、プロセスが SIGXCPU をブロックした場合、受け取った場合、または無視している場合は、動作は不定になります。
HP-UX では、UNIX 95 に適合したアプリケーションの指定したとおりに、 SIGXCPU をブロックするか、受け取るか、または無視します。
HP-UX のこの動作を前提に作成されたアプリケーションは、この動作とは違う
UNIX 標準環境では正常に動作しません。 アプリケーションが古い HP-UX
アプリケーションである場合、 カーネルは、この制限を超えたことによるシグナルを送ることができません。
しかし、このシグナルが、 ほかのアプリケーションによって、または、 kill
-XCPU コマンドを通して古い HP-UX アプリケーションに送られた場合、
このシグナルが通知され、 デフォルトのアクションが実行されます。
アプリケーションを UNIX 95 に適合させるためには、 unix95.o と直接的または間接的にリンクする必要があります。
たとえば、以下のようにします。 % export UNIX95=1 % cc prog.c |
| RLIMIT_DATA | | これはプロセスのデータセグメントの最大サイズ (バイト単位)
です。 指定した値を超えた場合、 brk()、 malloc()、
および sbrk() 関数は失敗し、 errno に
ENOMEM が設定されます。 RLIMIT_DATA に RLIM_INFINITY を設定することはできません。
上限は、 maxdsiz によって強制的に制限されています。ただし、 maxdsiz は調整可能です。 |
| RLIMIT_FSIZE | | このオプションは、UNIX 95 に適合したアプリケーションにのみ適応されます。
UNIX 95 適合アプリケーションについては、 上記の RLIMIT_CPU オプションを参照してください。
これはプロセスが作成できるファイルの最大サイズ (バイト単位) です。
0 を指定すると、ファイルは作成されません。 書き込みまたは切り詰め作業によりこの制限を超えた場合は、 SIGXFSZ がプロセスに対して生成されます。
プロセスが SIGXFSZ をブロックした場合、受け取った場合、または無視している場合は、制限を越えてファイルの最後からファイルサイズを増加する試みは失敗し、 EFBIG が errno に設定されます。 |
| RLIMIT_NOFILE | | これはシステムが新規作成の記述子に指定できる最大値よりも大きい数値です。
指定した値を超えた場合、新しいファイル記述子を割り当てる関数は失敗し、 errno は EMFILE に設定されます。
これにより、1 つのプロセスが割り当てることができるファイル記述子の数も制限されます。 |
| RLIMIT_STACK | | これはプロセスのスタックの最大サイズ (バイト単位)
です。 インプリメンテーションでは、スタックをこの値より大きいサイズへ自動的に拡張することはできません。
指定した値を超えた場合、 SIGSEGV がプロセスに対して生成されます。
プロセスが SIGSEGV をブロックまたは無視、または SIGSEGV を受信し、代替スタックの使用を準備していない場合は、 SIGSEGV の処置は、それが生成される前に SIG_DFL に設定されます。 RLIMIT_STACK に RLIM_INFINITY を設定することはできません。
上限は、 maxssiz によって強制的に制限されています。ただし、 maxssiz は調整可能です。 |
| RLIMIT_AS | | これはプロセスの総利用可能メモリーの最大サイズ (バイト単位)
です。 この限度を超えた場合、 brk()、 malloc()、 mmap()、
および sbrk() 関数は失敗し、 errno は ENOMEM に設定されます。
さらに、スタックの自動拡張は失敗し、上記のような影響があります。 |
| RLIMIT_AIO_OPS | | これはプロセスが同時にエンキューできる POSIX 非同期
I/O 操作の最大数です。 この限度を超えた場合、 aio_read()、 aio_write()、
および lio_listio() 関数は失敗し、 errno が EAGAIN に設定されます。 |
| RLIMIT_AIO_MEM | | これは単一のプロセスからの POSIX 非同期 I/O 要求によって同時にロックできるメモリーの最大サイズ
(バイト単位) です。 |
戻り値
正常終了の場合、 getrlimit() と setrlimit() は 0 を返します。
失敗の場合は、関数は -1 を返し、エラーの種類を表す値を errno に設定します。
エラー
getrlimit() と setrlimit() 関数は次の場合に失敗します。
| [EINVAL] | | 無効なリソースが指定された、または、 setrlimit() の呼び出しで、新しい rlim_cur が新しい rlim_max を超えた場合 |
| [EFAULT] | | rlp で指定されたアドレスが無効である場合。 実装方式によっては、このエラーが正しく検出されないことがあります。 |
| [EPERM] | | setrlimit() に指定された値が最大の制限値より大きく、呼び出しプロセスに適切な特権がない場合 |
setrlimit() 関数は次の場合に失敗します。
| [EINVAL] | | 指定した値よりも現在の使用量がすでに超えているため、制限値を指定した値に設定することができない場合 |
| [EPERM] | | rlp 引き数が現在の物理制限の値を超えているか、 呼び出し側が適切な特権を持っていない場合 |
| [EINVAL] | | 適切な特権を持っているユーザーが、 rlp->rlim_cur と rlp->rlim_max をシステムがサポートしているよりも大きい値に設定しようとした場合 |
| [EINVAL] | | rlp->rlim_cur の値がプロセスにすでに割り当てられているファイル記述子の数より少ない場合 |
| [EINVAL] | | rlp->rlim_max の値が現在の論理制限より少ない場合 |
警告
getrlimit() が返すファイルの最大サイズは、バイト単位です。 UL_GETFSIZE を指定した ulimit ulimit(2) を参照) が返すファイルの最大サイズは、サイズ
512 バイトのブロック単位です。 UL_GETFSIZE を指定した ulimit が返す値は、このように
512 の倍数に切り捨てられている可能性があります。
プロセスが使うアドレス空間の総量は、そのプロセスの動作するプラットフォームごとに異なります。
アプリケーションを移植するときは、 setrlimit() で RLIMIT_AS に設定している上限を調整しなければならない場合もあります。
たとえば、Itanium ベース システムでプログラムを実行する場合は、PA-RISC
システムで実行させるときよりメモリーが余分に必要です。
著者
getrlimit() と setrlimit() は、HP、AT&T、カリフォルニア大学バークレイ校で開発されました。
参照
brk(2), exec(2), fork(2), creat64(2), malloc(3C), open(2),
sigaltstack(2), sysconf(2), ulimit(2), maxdsiz(5), maxssiz(5), <stropts.h>, <sys/resource.h>