서버에서 데몬(백그라운드 프로세스, 서비스)로 동작하면서 시스템의 변화를 확인하기 위해서 사용했던 내용으로 리눅스에서 c로 간단하게 구현할 수 있는 방법을 소개한다.
--- 시스템 관리 함수 관련 글타래 -------------------------------
1. 시스템 메모리 사용량 확인 : meminfo() 또는 sysinfo()
2. 프로세스의 리소스 정보 확인 : getrusage()
3. 파일시스템(저장소) 정보 확인 : fstatvfs()
--------------------------------------------------------------------
embeddedclub.net에서 조회수가 많이있는것으로 보아 언젠가는 독자께 도움이 될수 있을 거라 판단하여 게시물을 이동하였다.
1. 시스템 메모리 사용량 확인
1.1. meminfo()
1.1.1. sysnopsis
(1) C 기반
typedef struct {
    long total;
    long free;
    long shared;
    long buffers;
    long cached;
    long swap_total;
    long swap_free;
} MEMINFO;
meminfo(MEMINFO *);
(2) CPP 기반
typedef struct {
    long total;
    long free;
    long shared;
    long buffers;
    long cached;
    long swap_total;
    long swap_free;
} MEMINFO;
extern "C" void meminfo(MEMINFO *);
meminfo(MEMINFO *);
1.1.2. Description
meminfo 기능은 Linux /proc/meminfo 파일을 구문 분석하고 C 또는 Fortran 프로그램에서 사용하기 위해 파일에 포함된 메모리 사용 정보를 반환.
1) 구조체 멤버 정보
- 멤버 1: 사용 가능한 총 메모리 양.
- 멤버 2: 사용자메모리(Heap)에서 사용 가능한 메모리 양을
- 멤버 3: 공유 메모리의 양을 포함하고, 
- 멤버 4: 시스템 버퍼에서 사용하는 메모리 양
- 멤버 5: 캐시되는 메모리 양
- 멤버 6 : 스왑 공간의 양
- 멤버 7 : 잔여 스왑 공간
2) 반환값
정상적이면 0, 1이면 오류
1.2. sysinfo()
meminfo()의 경우 시스템 버전에 때라 사용되지 않는 경우가 있다. 그런경우 sysinfo()를 이용하여 meminfo()의 기능을 대신할 수 있다.
1.2.1. sysnopsis
1) 함수원형
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info)
2) 구조체
struct sysinfo {
    long uptime;            
    unsigned long totalram;   
    unsigned long freeram;    
    unsigned long sharedram;   
    unsigned long bufferram;  
    unsigned long totalswap;   
    unsigned long freeswap;   
    unsigned short procs;    
    char _f[22];               
};
1.2.2. Description
1) 구조체 멤버정보
  sysinfo() 는 전체적인 시스템 통계 정보를 가져오기 위해서 사용한다. 가져온 정보는 struct sysinfo 에 채워진다. 
struct sysinfo 는 다음과 같은 멤버변수를 가진다.
uptime : 부팅 이후 지나간 초단위 시간
totalram : 사용할 수 있는 총 메모리 크기
freeram : 이용할 수 있는 메모리 크기
sharedram : 공유 메모리의 양
bufferram : 버퍼에 의해 사용된 메모리
totalswap : 총 스왑 공간의 크기
freeswap : 이용할 수 있는 스왑 공간
procs : 현재 프로세스의 수
char _f[22] : 구조체를 64 bytes로 채운다(pad)
2) 반환값
성공시 0, 실패하면 -1 (이외 여러 오류가 발생할 수 있으며, 일반적으로 EFAULT(errno 코드)가 발생.
1.2.3. 예제
아래는 sysinfo()의 예시이다.
#include <sys/sysinfo.h>
int main(void)
{
    struct sysinfo info;
    sysinfo(&info); 
    printf("load: %d %d %d\n", info.loads[0], info.loads[1], info.loads[2]);
    printf("mem : %d %d %d\n", info.totalram, info.totalram-info.freeram, info.freeram);
}
도움이 되었길 바란다.





최근댓글