GETRLIMIT(2)

명칭
getrlimit, setrlimit - 최대 system resource 소비를 제어한다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/time.h> <sys/resource.h> int getrlimit(int resource, struct rlimit *rlp) int setrlimit(int resource, const struct rlimit *rlp)

해설
현재의 프로세스, 및 그것이 작성하는 각 프로세스에 의한 system resource의 소비 한도는, getrlimit() 호출로 취득할 수가 있어 setrlimit() 호출로 설정할 수 있습니다.

resource 파라미터는 다음 중 1 개입니다.

RLIMIT_CORE
    작성할 수 있다 core(5) 파일의 최대 사이즈 (바이트 단위)

RLIMIT_CPU
    각 프로세스가 사용하는 CPU 시간의 최대량 (초단위)

RLIMIT_DATA
    프로세스용의 데이터 세그먼트의 최대 사이즈 (바이트 단위). 이것은, 프로그램이 그 브레이크를 sbrk(2) 시스템 콜로 어느 정도 먼 곳까지 연장할 수 있는지를 정의합니다.

RLIMIT_FSIZE
    작성할 수 있는 파일의 최대 사이즈 (바이트 단위)

RLIMIT_MEMLOCK
    프로세스가 mlock(2) 함수를 사용해, 프로세스를 메모리에 잠글 수 있다 최대 사이즈 (바이트 단위).

RLIMIT_NOFILE
    이 프로세스가 열리는 파일의 최대수

RLIMIT_NPROC
    이 유저 ID 를 동시에 이용할 수 있는 프로세스의 최대수

RLIMIT_RSS
    증가시켜 좋은 프로세스의 상주 세트 사이즈의 최대 사이즈 (바이트 단위). 이것은 프로세스에게 줄 수 있는 물리 메모리의 양에 제한을 부과합니다. 메모리가 핍박해 시스템이 메모리를 회수할 때에, 선언된 상주 세트 사이즈를 넘는 프로세스를 회수 대상으로 해 선택합니다.

RLIMIT_STACK
    프로세스의 스택 세그먼트의 최대 사이즈 (바이트수). 이것에 의해, 프로그램의 스택 세그먼트를 어느 정도 연장할 수 있을까 정의할 수 있습니다. 스택 연장은 시스템에 의해 자동적으로 실행됩니다.

RLIMIT_SBSIZE
    이 유저가 사용할 수 있는 소켓 버퍼의 최대 사이즈 (바이트 단위). 이 사이즈는, 유저를 언제라도 보관 유지할 수 있는 네트워크메모리량을 제한하기 때문에, 따라 mbuf 의 사용량도 제한합니다.

리소스 제한은 소프트 리밋트 및 하드 리밋트로서 지정됩니다. 소프트 제한을 넘었을 경우, 프로세스는 시그널을 수신할 가능성이 있습니다 (예를 들면, CPU 시간 또는 파일 사이즈를 넘었을 경우)(이)가, 하드 제한에 도달한다 (또는 리소스 리밋트를 수정한다) 까지 실행을 계속할 수 있습니다. rlimit 구조체를 사용해 리소스의 하드 제한와 소프트 리밋트를 지정할 수 있습니다.

    struct rlimit {
    	rlim_t	rlim_cur;	/* 현재의 (소프트) 제한 */
    	rlim_t	rlim_max;	/* rlim_cur 의 최대치 */
    };

슈퍼 유저만이 제한의 최대치를 크게 할 수 있습니다. 다른 유저는 0 으로부터 rlim_max 의 범위내에서 rlim_cur (을)를 변경하는지, 또는 rlim_max (을)를 내릴 수 있을 뿐입니다 (철회는 할 수 없습니다).

제한을 “무제한” (으)로 하는 값은 RLIM_INFINITY (으)로서 정의됩니다.

이 정보는 프로세스마다의 정보에 보존되므로, 쉘이 장래 작성하는 모든 프로세스에 이 시스템 콜이 영향을 미치기 위해서(때문에)는, 이 시스템 콜을 쉘이 직접 실행할 필요가 있습니다. 이 때문에 limit 하 csh(1) 의 편입 명령이 되어 있습니다.

시스템은, 통상의 방법으로 제한을 넘으려고 할 경우에, 데이터 또는 스택 공간을 연장하는 것을 거절합니다. 데이터 공간 제한에 도달하면(자) brk(2) 호출은 처리에 실패합니다. 스택 제한에 도달하면(자), 프로세스는 세그먼트(segment) 예외 (SIGSEGV) (을)를 수신합니다. 시그널 스택을 사용하는 핸들러에 의해 이 시그널이 포착되지 않는 경우, 이 시그널은 프로세스를 말소합니다.

프로세스의 소프트 제한보다 큰 파일을 작성하는 파일의 입출력 조작을 하면(자) 기록은 실패해, 시그널 SIGXFSZ 하지만 생성됩니다. 통상, 이것에 의해 프로세스는 종료합니다만, 포착할 수도 있습니다. CPU 시간의 소프트 제한을 넘었을 때, 시그널 SIGXCPU 하지만 장해를 일으키고 있는 프로세스에 송신됩니다.

반환값

에러
getrlimit() 및 setrlimit() (은)는 다음의 경우에 실패합니다.

[EFAULT]
    rlp 그리고 지정한 주소가 부정합니다.

[EPERM]
    setrlimit() (으)로 지정된 제한이 리밋트의 최대치를 상승 시키려고 했습니다만, 호출측은 슈퍼 유저가 아닙니다.

관련 항목
csh(1), quota(1), quotactl(2), sigaltstack(2), sigvec(2), sysctl(3)

역사
getrlimit() 함수는 4.2BSD 그리고 처음 등장했습니다.