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

getrlimitシステムコール

概要

getrlimitはプロセスが使用するシステムリソースの上限を取得します。

リソースには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, char *resname)
{
    struct rlimit rl;
    int rc = 0;

    printf("[%s]\n", resname);
    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;

    rc = check_rlimit(RLIMIT_CPU, "cpu time");
    if(rc != 0) return(-1);

    rc = check_rlimit(RLIMIT_FSIZE, "file size");
    if(rc != 0) return(-1);

    rc = check_rlimit(RLIMIT_DATA, "data segment size");
    if(rc != 0) return(-1);

    rc = check_rlimit(RLIMIT_STACK, "stack size");
    if(rc != 0) return(-1);

    rc = check_rlimit(RLIMIT_CORE, "core file size");
    if(rc != 0) return(-1);

    rc = check_rlimit(RLIMIT_NOFILE, "open file");
    if(rc != 0) return(-1);

    return(0);
}

関連ページ