#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구조체는 다음의
멤버들을 가진다.
소프트 리미트(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()에서 잘못된 resource나
who값을 사용했을 경우
EPERM
슈퍼유저가 아닌 사용자가 setrlimit()를 이용해서 현재 하드리미트 값을
초과해서 소프트 리미트 값이나 하드 리미트 값을 적용시킬려고 할경우
일반 유저는 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
1장. getrlimit(2)
자원(resource)의 값을 얻어오고, 값을 설정한다.
1.1. 사용법
1.2. 설명
getrlimit()와 setrlimit()는 자원의 제한값을 알아내거나 설정하기 위해서 사용한다. 이때 자원의 종류는 resource를 이용해서 지정가능하다. resource는 다음중 하나이다. 리소스의 크기는 rlim를 이용하면 된다. rlim구조체는 다음의 멤버들을 가진다.
다음은 선택가능한 resource의 종류들이다.
getrusage()는 현재 사용중인 resource 정보를 되돌려준다. who는 RUSAGE_SELF 와 RUSAGE_CHILDREN 둘 중 하나를 선택할 수 있다. 전자는 현재 프로세스가 사용하는 리소스의 정를보 되돌려주고 후자는 현재 프로세스와 그 자식 프로세스들이 사용하는 모든 리소스의 정보를 되돌려준다(종료되어서 기다리는 자식 프로세스도 포함된다.) 이들 리소스 정보는 rusage에 저장된다.
1.3. 반환값
성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.
1.4. 에러
rlim 혹은 usage이 잘못된 주소를 가리키고 있다.
getrlimit()나 setrlimit()에서 잘못된 resource나 who값을 사용했을 경우
슈퍼유저가 아닌 사용자가 setrlimit()를 이용해서 현재 하드리미트 값을 초과해서 소프트 리미트 값이나 하드 리미트 값을 적용시킬려고 할경우
1.5. 예제
기타 설명
Recent Posts
Archive Posts
Tags