C言語システムコール-setrlimit

setrlimitシステムコール

概要

setrlimitはプロセスが使用するシステムリソースの上限を設定します。

リソースにはCPU時間やファイルサイズなどがあり、それらに上限を設定できます。

リソースのリミット値はrlimit構造体を介して取得します。


リミットには「ソフトリミット」と「ハードリミット」があります。

ソフトリミットとは、警告付きで一時的に超えることのできる目安の限界値です。

ハードリミットは厳密な限界値であり、超えた場合にはエラーとなります。


例えばCPU時間のリミット例を挙げます。

プロセスの消費したCPU時間がソフトリミットを超過すると、プロセスに「SIGXCPU」シグナルが送信されます。

プロセスの消費したCPU時間がハードリミットを超過すると、プロセスに「SIGKILL」シグナルが送信され、プロセスが強制終了されます。


ソフトリミットはハードリミット以下の値に設定します。

ハードリミットの変更にはroot権限が必要になります。

リミットを無制限(RLIM_INFINITY)にすることは可能です。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>

int
check_rlimit(int resource)
{
    struct rlimit rl;
    int rc = 0;

    rc = getrlimit(resource, &rl);
    if(rc < 0){
        printf("Error: getrlimit(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    if(rl.rlim_cur == RLIM_INFINITY){
        printf("soft limit = unlimited\n");
    }else{
        printf("soft limit = %lld\n", (long long)rl.rlim_cur);
    }

    if(rl.rlim_max == RLIM_INFINITY){
        printf("hard limit = unlimited\n");
    }else{
        printf("hard limit = %lld\n", (long long)rl.rlim_max);
    }

    return(0);
}

int
main(void)
{
    int rc = 0;
    struct rlimit rl;

    rl.rlim_cur = 1;
    rl.rlim_max = 2;

    rc = setrlimit(RLIMIT_CPU, &rl);
    if(rc < 0){
        printf("Error: setrlimit(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    rc = check_rlimit(RLIMIT_CPU);
    if(rc != 0) return(-1);

    return(0);
}

関連ページ