Linux 시스템 호출 -- getrlimit/settrimit 함수 상세 설명

기능 설명: 자원 사용 제한 을 가 져 오 거나 설정 합 니 다.모든 자원 은 관련 된 소프트 하 드 제한 이 있 고 소프트 제한 은 커 널 이 해당 자원 에 강요 하 는 제한 치 이 며 하 드 제한 은 소프트 제한 의 최대 치 이다.비 권한 호출 프로 세 스 는 소프트 제한 을 0 ~ 하 드 제한 범위 의 특정한 값 으로 지정 할 수 있 으 며, 동시에 하 드 제한 을 되 돌 릴 수 없습니다.권한 수여 프로 세 스 는 소프트 하 드 제한 을 임의로 바 꿀 수 있 습 니 다.RLIM_인 피 니 티 의 값 은 자원 제한 이 아니 라 는 것 을 나타 낸다.
사용법:
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

인자:
resource: 가능 한 선택 은
RLIMIT_AS//프로 세 스 의 최대 가상 메모리 공간, 바이트 단위 입 니 다.RLIMIT_CORE//커 널 저장 파일 의 최대 길이 입 니 다.RLIMIT_CPU//최대 허용 되 는 CPU 사용 시간, 초 단위.프로 세 스 가 소프트 제한 에 도달 하면 커 널 은 SIGXCPU 신 호 를 보 냅 니 다. 이 신호 의 기본 동작 은 프로 세 스 의 실행 을 중지 하 는 것 입 니 다.그러나 신 호 를 포착 할 수 있 고 핸들 을 처리 하면 메 인 프로그램 에 제 어 를 되 돌려 줄 수 있다.프로 세 스 가 CPU 시간 을 계속 소모 하면 핵심 은 1 초 에 한 번 씩 SIGXCPU 신 호 를 보 내 고 하 드 제한 에 도달 할 때 까지 SIGKILL 신 호 를 보 내 실행 을 종료 합 니 다.RLIMIT_DATA//프로 세 스 데이터 세그먼트 의 최대 값 입 니 다.RLIMIT_FSIZE//프로 세 스 가 만 들 수 있 는 파일 의 최대 길이 입 니 다.프로 세 스 가 이 제한 을 초과 하려 고 할 때 핵심 은 SIGXFSZ 신 호 를 보 내 고 기본적으로 프로 세 스 의 실행 을 종료 합 니 다.RLIMIT_LOCKS//프로 세 스 가 만 들 수 있 는 자물쇠 와 임대 의 최대 값 입 니 다.RLIMIT_MEMLOCK//프로 세 스 는 메모리 의 최대 데 이 터 량, 바이트 단위 로 잠 글 수 있 습 니 다.RLIMIT_MSGQUEUE//프로 세 스 가 POSIX 메시지 큐 에 할당 할 수 있 는 최대 바이트 수 입 니 다.RLIMIT_NICE//프로 세 스 는 setpriority () 나 nice () 를 통 해 설정 의 최대 완벽 치 를 호출 할 수 있 습 니 다.RLIMIT_NOFILE//프로 세 스 가 열 수 있 는 최대 파일 설명 어 보다 큰 값 을 지정 합 니 다. 이 값 을 초과 하면 EMFILE 오류 가 발생 합 니 다.RLIMIT_NPROC//사용자 가 가 질 수 있 는 최대 프로 세 스 수 입 니 다.RLIMIT_RTPRIO//프로 세 스 는 schedsetscheduler 와 schedsetparam 설정 의 최대 실시 간 우선 순위 입 니 다.RLIMIT_SIGPENDING//사용자 가 가 질 수 있 는 최대 연결 신호 수 입 니 다.RLIMIT_STACK//최대 프로 세 스 스 택 은 바이트 단위 입 니 다.
rlim: 자원 소프트 하 드 제한 구조 체 를 설명 하고 원형 은 다음 과 같 습 니 다.
struct rlimit {
  rlim_t rlim_cur;
  rlim_t rlim_max;
};

설명 을 되 돌려 줍 니 다:
성공 적 으로 실행 되 었 을 때 0 을 되 돌려 줍 니 다.실패 반환 - 1, errno 가 다음 값 으로 설정 되 었 습 니 다 EFAULT: rlim 포인터 가 가리 키 는 공간 은 EINVAL 에 접근 할 수 없습니다: 매개 변수 가 잘못 되 었 습 니 다 EPERM: 자원 제한 값 을 증가 할 때 권한 이 허용 되 지 않 습 니 다.
 
확장 읽 기:
ulimit 와 setrlimit 는 task 프로 세 스 자원 상한 값 을 쉽게 수정 합 니 다.
Liux 시스템 에서 Resouce limit 은 프로 세 스 의 실행 과정 에서 얻 을 수 있 는 자원 의 제한 을 말 합 니 다. 예 를 들 어 프로 세 스 의 core file 의 최대 값, 가상 메모리 의 최대 값 등 입 니 다.
Resouce limit 의 크기 는 프로 세 스 의 실행 상황 에 직접적인 영향 을 줄 수 있 습 니 다.두 가지 가장 중요 한 개념 이 있 는데 그것 이 바로 soft limit 과 hard limit 이다.
struct rlimit {
  rlim_t rlim_cur;  //soft limit
  rlim_t rlim_max;  //hard limit
};

soft limit 은 커 널 이 지원 할 수 있 는 자원 상한 선 을 말한다.예 를 들 어 RLIMITNOFILE (하나의 프로 세 스 가 열 수 있 는 최대 파일 수, 커 널 기본 값 은 1024), soft limit 최대 도 1024 에 불과 합 니 다.RLIMIT 에 대해CORE (core 파일 의 크기, 커 널 은 제한 하지 않 습 니 다), soft limit 의 최대 능력 은 unlimited 입 니 다.hard limit 은 자원 에서 soft limit 의 상한 선 일 뿐 입 니 다.hard limit 을 설정 하면 나중에 설정 한 soft limit 은 hard limit 보다 작 을 수 밖 에 없습니다.설명 하고 자 하 는 것 은, hard limit 는 비 특권 프로 세 스, 즉 프로 세 스 의 유효한 사용자 ID (effective user ID) 가 0 프로 세 스 가 아 닙 니 다.특권 등급 의 프로 세 스 (속성 CAP SYS RESOURCE 가 있 음), soft limit 는 커 널 상한 선 만 있 습 니 다.
우 리 는 아래 두 명령 의 출력 을 볼 수 있다.
sishen@sishen:~$ ulimit -c -n -s
core file size (blocks, -c) 0
open files (-n) 1024
stack size (kbytes, -s) 8192

sishen@sishen:~$ ulimit -c -n -s -H
core file size (blocks, -c) unlimited
open files (-n) 1024
stack size (kbytes, -s) unlimited

- H 는 hard limit 를 나타 낸다.결 과 를 보면 soft limit 과 hard limit 의 차 이 를 알 수 있다.unlimited 는 no limit, 즉 커 널 의 최대 치 를 나타 낸다.
resource limit 의 읽 기 수정 에는 두 가지 방법 이 있 습 니 다.
* 셸 내장 명령 ulimit 사용 * getrlimit 와 setrlimit API 사용
ulimit 는 셸 의 resource limit 을 바 꾸 고 셸 이 시작 하 는 프로 세 스 를 바 꾸 는 resource limit 효과 (하위 프로 세 스 계승) 입 니 다.
usage:ulimit [-SHacdefilmnpqrstuvx [limit]]

limit 가 지정 되 지 않 았 을 때 이 명령 은 현재 값 을 표시 합 니 다.여기 서 주의해 야 할 것 은 limit 을 수정 하려 고 할 때 - S 나 - H 를 지정 하지 않 으 면 기본적으로 soft limit 과 hard limit 을 동시에 설정 합 니 다.그 러 니까 나중에 설치 할 때 줄 일 수 밖 에 없고 늘 릴 수 없 는 거 야.따라서 ulimit 설정 limit 인 자 는 - S 를 추가 하 는 것 을 권장 합 니 다.
getrlimit 와 setrlimit 의 사용 도 간단 하고 manpage 에 명확 한 설명 이 있 습 니 다.
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

주의해 야 할 것 은 setrlimit 에 있 습 니 다. 새 값 이 hard limit 를 초과 하 는 지 확인 해 야 합 니 다.다음 과 같은 Linux 시스템 에서 응용 프로그램 이 실행 되 는 과정 에서 프로그램 이 갑자기 무 너 지 는 경우 가 많 습 니 다. 알림: Segmentation fault, 이것 은 응용 프로그램 이 SIGSEGV 신 호 를 받 았 기 때 문 입 니 다.이 신 호 는 프로 세 스 가 잘못된 저장 접근 을 했 을 때 이 신 호 를 받 았 을 때 부족 한 동작 은 w/core 를 종료 하 는 것 입 니 다.w/core 를 종료 하 는 의 미 는 프로 세 스 의 현재 디 렉 터 리 에 core 파일 을 만 들 고 프로 세 스 의 메모리 이미 지 를 core 파일 에 복사 하 는 것 입 니 다. core 파일 의 기본 이름 은 "core"입 니 다.사실 SIGSEGV 신호 만 coredump 가 발생 하 는 것 이 아니 라 다음 신호 도 coredump: SIGABRT (이상 종료), SIGBUS (하드웨어 고장), SIGEMT (하드웨어 고장), SIGFPE (산술 이상), SIGIL (불법 하드웨어 명령), SIGIOT (하 드 부품 고장), SIGQUIT, SIGSYS (무효 시스템 호출), SIGTRAP (하드웨어 고장) 등 이 발생 한다.Linux 시스템 에 서 는 프로그램 이 실행 되 는 과정 에서 프로그램 이 갑자기 무 너 지 는 경우 가 많 습 니 다. 알림: Segmentation fault, 이것 은 프로그램 이 SIGSEGV 신 호 를 받 았 기 때 문 입 니 다.이 신 호 는 프로 세 스 가 잘못된 저장 접근 을 했 을 때 이 신 호 를 받 았 을 때 부족 한 동작 은 w/core 를 종료 하 는 것 입 니 다.w/core 를 종료 하 는 의 미 는 프로 세 스 의 현재 디 렉 터 리 에 core 파일 을 만 들 고 프로 세 스 의 메모리 이미 지 를 core 파일 에 복사 하 는 것 입 니 다. core 파일 의 기본 이름 은 "core"입 니 다.사실 SIGSEGV 신호 만 coredump 가 발생 하 는 것 이 아니 라 다음 신호 도 coredump: SIGABRT (이상 종료), SIGBUS (하드웨어 고장), SIGEMT (하드웨어 고장), SIGFPE (산술 이상), SIGIL (불법 하드웨어 명령), SIGIOT (하 드 부품 고장), SIGQUIT, SIGSYS (무효 시스템 호출), SIGTRAP (하드웨어 고장) 등 이 발생 한다.resource limit 의 읽 기 수정 에는 두 가지 방법 이 있 습 니 다.
* 셸 내장 명령 ulimit 사용 * getrlimit 와 setrlimit APIsetrlimit 사용:
if (getrlimit(RLIMIT_CORE, &rlim)==0) {
  rlim_new.rlim_cur = rlim_new.rlim_max = RLIM_INFINITY;
  if (setrlimit(RLIMIT_CORE, &rlim_new)!=0) {
    rlim_new.rlim_cur = rlim_new.rlim_max = rlim.rlim_max;
    (void) setrlimit(RLIMIT_CORE, &rlim_new);
  }
}

좋은 웹페이지 즐겨찾기