ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ setrlimit(2) getrlimit(2)
    C,C++ & Linux 2020. 5. 23. 03:51
    728x90

    함수 기능

    리소스 한계치를 알아내거나 바꾸는 함수입니다.

    시스템마다 리소스의 한계치로 설정된 값들이 있습니다. 예를 들면 파일명 최대 길이, 프로세스 당 열 수 있는 최대 파일의 갯수 등이 있죠

     

    getrlimit() 함수는 이 한계치를 알아낼 수 있는 함수이고, setrlimit() 함수는 바꿀 수 있는 함수입니다.

     

    리소스 종류

    구성요소 내용
    RLIMIT_AS 한 프로세스의 총 자유 메모리 용량의 최댓값(바이트 단위)
    RLIMIT_CORE 한 코어 파일의 최대 크기
    RLIMIT_CPU 프로세스가 소비할 수 있는 최대 CPU 시간(초 단위)
    RLIMIT_DATA Data 영역 전체의 최대 크기
    RLIMIT_FSIZE 파일 생성 시 파일의 최대 크기
    RLIMIT_LOCKS 프로세스가 가질 수 있는 파일 락의 최대 갯수
    RLIMIT_MEMLOCK 한 프로세스가 mlock으로 잠글 수 있는 최대 메모리 용량
    RLIMIT_NOFILE 한 프로세스가 열어둘 수 있는 최대 파일 개수
    RLIMIT_NPROC Real User ID 당 최대 자식 프로세스 개수
    RLIMIT_RSS 메모리 상주 세트 크기(RSS: Resident Set Size)의 최대값
    RLIMIT_SBSIZE 한 사용자가 한 시점에서 사용할 수 있는 소켓 버퍼의 최대 크기
    RLIMIT_STACK 스택 최대 크기
    RLIMIT_VMEM RLIMIT_AS와 동일

     

    struct rlimit 구조

    struct rlimit {
        rlim_t rlim_cur;	// 약한 한계
        rlim_t rlim_max;	// 강한 한계
    };

    약한 한계를 초과했을 때는 프로세스에 시그널이전달 될 수도 있으나 강한 한계를 초과할 때까지 실행을 할 수 는 있습니다.

    Root 권한을 가져야지만 강한 한계를 올릴 수 있으며 일반 사용자는 0과 rlim_max 사이의 범위 내에서 rlim_cur 값을 조정할 뿐입니다.

    뿐만 아니라 rlim_cur 값을 한 번 낮추게 되면 다시 원래대로 높일 수 없습니다.

     

    함수 원형

    #include <sys/resource.h>
    #include <sys/time.h>
    
    int getrlimit(int resource, struct rlimit *rlptr);
    int setrlimit(int resource, const struct rlimit *rlptr);

     

    매개변수

    resource

    한계치를 변경하거나 얻고자 하는 리소스 ( 표 참고 )

     

    rlptr

    getrlimit() : 한계치를 알아내어 rlptr 에 넣어줍니다.

    setrlimit() : 새로운 한계치를 담아 넘기면 한계치가 바뀝니다.

    반환값

    성공 시 0 리턴

    에러 시 -1 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/resource.h>
    #include <sys/time.h>
    
    // 매크로 함수 정의
    #define ssu_show(limit) ssu_show_limit(limit, #limit)
    
    void ssu_show_limit(int rlim_type, char *rlim_name) {
        struct rlimit rlim;
        char cur[11], max[11];
    
        // 리소스 한계치를 얻어옴
        getrlimit(rlim_type, &rlim);
    
        // 무한대인지 아닌지 구분
        if (rlim.rlim_cur == RLIM_INFINITY)
            strcpy(cur, "infinity");
        else
            sprintf(cur, "%10ld", rlim.rlim_cur);
    
        // 무한대인지 아닌지 구분
        if (rlim.rlim_max == RLIM_INFINITY)
            strcpy(max, "infinity");
        else
            sprintf(cur, "%10ld", rlim.rlim_cur);
    
        printf("%15s : %10s %10s\n", rlim_name, cur, max);
    }
    
    int main(int argc, char *argv[], char *envpp[]) {
        printf("\tresource soft limit hard limit\t\n\n");
        ssu_show(RLIMIT_CPU);
        ssu_show(RLIMIT_FSIZE);
        ssu_show(RLIMIT_DATA);
        ssu_show(RLIMIT_STACK);
        ssu_show(RLIMIT_CORE);
    #ifdef RLIMIT_RSS
        ssu_show(RLIMIT_RSS);
    #endif
    #ifdef RLIMIT_MEMLOCK
        ssu_show(RLIMIT_MEMLOCK);
    #endif
    #ifdef RLIMIT_NPROC
        ssu_show(RLIMIT_NPROC);
    #endif
    #ifdef RLIMIT_OFILE
        ssu_show(RLIMIT_OFILE);
    #endif
    #ifdef RLIMIT_VMEN
        ssu_show(RLIMIT_VMEN);
    #endif
    
        printf("RLIMIT_CPU 변경\n");
        struct rlimit l;
        l.rlim_cur = 5000000L;
        l.rlim_max = RLIM_INFINITY;
    
        // RLIMIT_DATA 리소스의 한계치를 변경
        if (setrlimit(RLIMIT_DATA, &l) < 0) {
            fprintf(stderr, "error\n");
            exit(1);
        }
        ssu_show(RLIMIT_DATA);
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ fork(2)  (0) 2020.05.24
    C/C++ getpid(2) getppid(2) getuid(2) geteuid(2) getgid(2) getegid(2)  (0) 2020.05.23
    C/C++ setjmp(3) longjmp(3)  (0) 2020.05.23
    C/C++ setenv(3) unsetenv(3)  (0) 2020.05.23
    C/C++ putenv(3)  (0) 2020.05.22

    댓글

Designed by Tistory.