-
C/C++ setrlimit(2) getrlimit(2)C,C++ & Linux 2020. 5. 23. 03:51728x90
함수 기능
리소스 한계치를 알아내거나 바꾸는 함수입니다.
시스템마다 리소스의 한계치로 설정된 값들이 있습니다. 예를 들면 파일명 최대 길이, 프로세스 당 열 수 있는 최대 파일의 갯수 등이 있죠
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