Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
Docbook 원문

getrlimit(2)

1장. getrlimit(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제

자원(resource)의 값을 얻어오고, 값을 설정한다.


1.1. 사용법

#include <sys/types.h>
#include <sys/resource.h>
#include <unistd.h>

int getrlimit(int resource, struct rlimit *rlim);
int getrusage(int who, struct rusage *usage);
int setrlimit(int resource, const struct rlimit *rlim);
		


1.2. 설명

getrlimit()와 setrlimit()는 자원의 제한값을 알아내거나 설정하기 위해서 사용한다. 이때 자원의 종류는 resource를 이용해서 지정가능하다. resource는 다음중 하나이다. 리소스의 크기는 rlim를 이용하면 된다. rlim구조체는 다음의 멤버들을 가진다.

struct rlimit
{
    rlim_t rlim_cur;   /* soft limit */
    rlim_t rlim_max;   /* Hard limit */ 
};
		
소프트 리미트(soft limit)는 변경하고자 하는 값을 커널에 요청한다. 하드 리미트(hard limit)는 자원의 설정가능한 최대 값으로 rlim_cur은 하드 리미트의 제한을 받게 된다.

다음은 선택가능한 resource의 종류들이다.

RLIMIT_CPU     /* 초 단위의 CPU 시간 */
RLIMIT_FSIZE   /* 최대 파일 크기 */
RLIMIT_DATA    /* 최대 데이타 크기 */
RLIMIT_STACK   /* 최대 스택 크기 */
RLIMIT_CORE    /* 최대 코어 파일 크기 */
RLIMIT_RSS     /* 최대 거주 집합 크기 */
RLIMIT_NPROC   /* 최대 프로세스 수 */
RLIMIT_NOFILE  /* 최대 열 수 있는 파일의 수 */
RLIMIT_MEMLOCK /* 최대 잠긴 기억 장소 주소 공간 */
RLIMIT_AS      /* 주소 공간(가상 메모리) 제한값 */
		

getrusage()는 현재 사용중인 resource 정보를 되돌려준다. who는 RUSAGE_SELF 와 RUSAGE_CHILDREN 둘 중 하나를 선택할 수 있다. 전자는 현재 프로세스가 사용하는 리소스의 정를보 되돌려주고 후자는 현재 프로세스와 그 자식 프로세스들이 사용하는 모든 리소스의 정보를 되돌려준다(종료되어서 기다리는 자식 프로세스도 포함된다.) 이들 리소스 정보는 rusage에 저장된다.

struct rusage {
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* messages sent */
    long   ru_msgrcv;        /* messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};
		


1.3. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4. 에러

EFAULT

rlim 혹은 usage이 잘못된 주소를 가리키고 있다.

EINVAL

getrlimit()나 setrlimit()에서 잘못된 resourcewho값을 사용했을 경우

EPERM

슈퍼유저가 아닌 사용자가 setrlimit()를 이용해서 현재 하드리미트 값을 초과해서 소프트 리미트 값이나 하드 리미트 값을 적용시킬려고 할경우


1.5. 예제

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

int main()
{
    struct rlimit rlim;

    // 생성가능한 프로세스의 갯수를 출력한다. (현재 : 최대) 
    getrlimit(RLIMIT_NPROC, &rlim);
    printf("PROC MAX : %lu : %lu\n", rlim.rlim_cur, rlim.rlim_max);

    // 오픈가능한 파일의 갯수를 출력한다.   
    getrlimit(RLIMIT_NOFILE, &rlim);
    printf("FILE MAX : %lu : %lu\n", rlim.rlim_cur, rlim.rlim_max);

    // 사용가능한 CPU자원을 출력한다. 
    getrlimit(RLIMIT_CPU, &rlim);

    // 만약 무한대로 사용가능하다면 UNLIMIT를 출력하도록한다.
    // CPU자원은 최대한 사용가능하도록 되어있음으로 UNLIMIT를 출력할것이다.
    if(rlim.rlim_cur == RLIM_INFINITY)
    {
        printf("UNLIMIT\n");
    }
}
		

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

int main(int argc, char **argv)
{
        struct rlimit rlim;

        getrlimit(RLIMIT_NOFILE, &rlim);
        printf("Open file %d : %d\n", rlim.rlim_cur, rlim.rlim_max);

        rlim.rlim_cur += 1024;
        rlim.rlim_max += 1024;
        if(setrlimit(RLIMIT_NOFILE, &rlim) == -1)
                return 0;
        printf("Open file %d : %d\n", rlim.rlim_cur, rlim.rlim_max);
}

기타 설명

일반 유저는 hard limit 값을 변경할 수 없다. 단지 hard limit 값의 하도 내에서 soft limit 값을 변경할 수 있을 뿐이다. 그러므로 실질적으로 제한 값을 변경하기 위해서는 루트 권한으로 /etc/security/limits.conf 파일에 초기 hard limit값과 soft limit값을 설정 해두어야 한다.

포맷은 다음과 같다.
# domain    type     item      value
# yundream 유저의 프로세스가 열 수 있는 파일의 개수를 soft limit 2048, hard limit 4096 으로 지정한다.
yundream    soft    nofile    2048
yundream    hard   nofile    4096