참조 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/QOS/SMS/Cpu_Usage
// Standard C++ Library
#include <iostream>
// Common Library
#include <cinterface.h>
// Standard C Library
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#define K4 0
#define K6 1
using namespace std;
int isTotal=0;
int findCpu=0;
int GetCpuNum();
int Type = 0;
struct _CpuStat
{
unsigned int User;
unsigned int System;
unsigned int Idle;
};
struct _CpuStat CpuStat[2];
char *rtvstr;
int Init()
{
GetCpuNum();
rtvstr = (char *)malloc(80);
return 1;
}
int cidx = 0;
// CPU 갯수를 얻어온다.
int GetCpuNum()
{
FILE *fp;
fp = fopen("/proc/stat", "r");
char buf[80];
isTotal=0;
findCpu=0;
if (fp == NULL)
{
return 0;
}
while(fgets(buf, 80, fp))
{
if (strncmp(buf, "cpu", 3) != 0)
{
continue;
}
if (isdigit(buf[3]))
{
findCpu++;
}
else
{
isTotal = 1;
}
}
fclose(fp);
return 1;
}
// Cpu 갯수를 리턴한다.
int NumRows()
{
return findCpu;
}
// proc 파일시스템을 분석해서 Cpu 사용율 정보를 얻어온다.
// /proc/stat 의 사용율 총합라인만 읽어올 것이다.
char *Read()
{
FILE *fp;
char buf[80];
fp = fopen("/proc/stat", "r");
char cpuid[8];
int nused;
if (fp == NULL)
{
return NULL;
}
while(fgets(buf, 80, fp))
{
if (!strncmp(buf, "cpu", 3))
{
sscanf(buf, "%s %d %d %d %d",
cpuid,
&CpuStat[cidx%2].User,
&nused,
&CpuStat[cidx%2].System,
&CpuStat[cidx%2].Idle
);
break;
}
}
// 처음실행했다면, 1초를 쉰다음 재귀호출 한다.
if (!cidx)
{
sleep(1);
cidx++;
*Read();
}
cidx++;
int diff1;
int diff2;
int diff3;
int Idle, System, User;
diff1 = CpuStat[(cidx+1)%2].User - CpuStat[(cidx)%2].User;
diff2 = CpuStat[(cidx+1)%2].System - CpuStat[(cidx)%2].System;
diff3 = CpuStat[(cidx+1)%2].Idle - CpuStat[(cidx)%2].Idle;
Idle = (diff3*100)/(diff1+diff2+diff3);
System = (diff2*100)/(diff1+diff2+diff3);
User = (diff1*100)/(diff1+diff2+diff3);
sprintf(rtvstr,"CPU=%d,%d,%d\n", User,System,Idle);
return rtvstr;
}
int Clean()
{
if (rtvstr != NULL)
free(rtvstr);
rtvstr = NULL;
return 1;
}
// Standard C++ Library
#include <iostream>
// Common Library
#include <cinterface.h>
// Standard C Library
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#define K4 0
#define K6 1
using namespace std;
int isTotal=0;
int findCpu=0;
int GetCpuNum();
int Type = 0;
struct _CpuStat
{
unsigned int User;
unsigned int System;
unsigned int Idle;
};
struct _CpuStat CpuStat[2];
char *rtvstr;
int Init()
{
GetCpuNum();
rtvstr = (char *)malloc(80);
return 1;
}
int cidx = 0;
// CPU 갯수를 얻어온다.
int GetCpuNum()
{
FILE *fp;
fp = fopen("/proc/stat", "r");
char buf[80];
isTotal=0;
findCpu=0;
if (fp == NULL)
{
return 0;
}
while(fgets(buf, 80, fp))
{
if (strncmp(buf, "cpu", 3) != 0)
{
continue;
}
if (isdigit(buf[3]))
{
findCpu++;
}
else
{
isTotal = 1;
}
}
fclose(fp);
return 1;
}
// Cpu 갯수를 리턴한다.
int NumRows()
{
return findCpu;
}
// proc 파일시스템을 분석해서 Cpu 사용율 정보를 얻어온다.
// /proc/stat 의 사용율 총합라인만 읽어올 것이다.
char *Read()
{
FILE *fp;
char buf[80];
fp = fopen("/proc/stat", "r");
char cpuid[8];
int nused;
if (fp == NULL)
{
return NULL;
}
while(fgets(buf, 80, fp))
{
if (!strncmp(buf, "cpu", 3))
{
sscanf(buf, "%s %d %d %d %d",
cpuid,
&CpuStat[cidx%2].User,
&nused,
&CpuStat[cidx%2].System,
&CpuStat[cidx%2].Idle
);
break;
}
}
// 처음실행했다면, 1초를 쉰다음 재귀호출 한다.
if (!cidx)
{
sleep(1);
cidx++;
*Read();
}
cidx++;
int diff1;
int diff2;
int diff3;
int Idle, System, User;
diff1 = CpuStat[(cidx+1)%2].User - CpuStat[(cidx)%2].User;
diff2 = CpuStat[(cidx+1)%2].System - CpuStat[(cidx)%2].System;
diff3 = CpuStat[(cidx+1)%2].Idle - CpuStat[(cidx)%2].Idle;
Idle = (diff3*100)/(diff1+diff2+diff3);
System = (diff2*100)/(diff1+diff2+diff3);
User = (diff1*100)/(diff1+diff2+diff3);
sprintf(rtvstr,"CPU=%d,%d,%d\n", User,System,Idle);
return rtvstr;
}
int Clean()
{
if (rtvstr != NULL)
free(rtvstr);
rtvstr = NULL;
return 1;
}