Joinc 팀블로그 리눅스 메뉴얼 정리 Joinc 위키
댓글

Recent Comments

Powered by Disqus
팀블로그 카테고리
  전체 (1105)
   공지사항 (1)
   검색엔진 (21)
   기술동향 (58)
   게임 (2)
   독서 (6)
   리눅스 (12)
   보안 (1)
   사회문제 (22)
   어셈블리 (43)
   영화 (3)
   오픈소스 (10)
   음악 (9)
   인물 (1)
   포인터 (4)
   프로그래머 (23)
   팀블로그 (20)
   테터툴즈 (29)
   C/C++ (152)
   FireFox (11)
   Gimp (2)
   Google (98)
   Java (13)
   Perl (2)
   Pthread (11)
   STL (13)
   TCP/IP (8)
   Tools (31)
   Web2.0 (42)
   Wiki (1)
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
2007/05/28 23:54

getrlimit - 자원의 값을 얻어오고, 값을 설정한다.

1장. getrlimit(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제

자원(resource)의 값을 얻어오고, 값을 설정한다.


1.1. 사용법

#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구조체는 다음의 멤버들을 가진다.

struct rlimit
{
rlim_t rlim_cur; /* soft limit */
rlim_t rlim_max; /* Hard limit */
};
소프트 리미트(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()에서 잘못된 resourcewho값을 사용했을 경우

EPERM

슈퍼유저가 아닌 사용자가 setrlimit()를 이용해서 현재 하드리미트 값을 초과해서 소프트 리미트 값이나 하드 리미트 값을 적용시킬려고 할경우


1.5. 예제

	
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
struct rlimit rlim;

// 생성가능한 프로세스의 갯수를 출력한다. (현재 : 최대)
getrlimit(RLIMIT_NPROC, &rlim);
printf("PROC MAX : %lu : %lu\n", rlim.rlim_cur, rlim.rlim_max);

// 오픈가능한 파일의 갯수를 출력한다.
getrlimit(RLIMIT_NOFILE, &rlim);
printf("FILE MAX : %lu : %lu\n", rlim.rlim_cur, rlim.rlim_max);

// 사용가능한 CPU자원을 출력한다.
getrlimit(RLIMIT_CPU, &rlim);

// 만약 무한대로 사용가능하다면 UNLIMIT를 출력하도록한다.
// CPU자원은 최대한 사용가능하도록 되어있음으로 UNLIMIT를 출력할것이다.
if(rlim.rlim_cur == RLIM_INFINITY)
{
printf("UNLIMIT\n");
}
}
:::