서버에서 데몬(백그라운드 프로세스, 서비스)로 동작하면서 시스템의 변화를 확인하기 위해서 사용했던 내용으로 리눅스에서 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);
}
도움이 되었길 바란다.
최근댓글