struct CPUSnapShot
{
CPUSnapShot()
{
char buff[256] = {0};
FILE * fd = fopen("/proc/stat", "r");
fgets(buff, sizeof(buff), fd);
fclose(fd);
sscanf(buff, "%s %u %u %u %u %u %u %u %u %u", name,
&user, &nice, &system, &idle,
&iowait, &irq, &softirq, &stealstolen,
&guest);
}
unsigned int Total()
{
return user +
nice +
system +
idle +
iowait +
irq +
softirq +
stealstolen +
guest;
}
char name[256];
unsigned int user;
unsigned int nice;
unsigned int system;
unsigned int idle;
unsigned int iowait;
unsigned int irq;
unsigned int softirq;
unsigned int stealstolen;
unsigned int guest;
};
struct ProcCPUSnapShot
{
ProcCPUSnapShot()
{
char strLinkFile[1024];
SPRINTF_SAFE(strLinkFile, "/proc/%d/stat", getpid());
char buff[256] = {0};
FILE * fd = fopen(strLinkFile, "r");
fgets(buff, sizeof(buff), fd);
fclose(fd);
char * tokenPtr = strtok(buff, " ");
int i = 0;
while (tokenPtr != NULL && i < 12)
{
tokenPtr = strtok(NULL, " ");
i++;
}
SAFE_TEST_RET(tokenPtr, NULL);
tokenPtr = strtok(NULL, " ");
SAFE_TEST_RET(tokenPtr, NULL);
utime = atoi(tokenPtr);
tokenPtr = strtok(NULL, " ");
SAFE_TEST_RET(tokenPtr, NULL);
stime = atoi(tokenPtr);
tokenPtr = strtok(NULL, " ");
SAFE_TEST_RET(tokenPtr, NULL);
cutime = atoi(tokenPtr);
tokenPtr = strtok(NULL, " ");
SAFE_TEST_RET(tokenPtr, NULL);
cstime = atoi(tokenPtr);
}
unsigned int Total()
{
return utime +
stime +
cutime +
cstime;
}
unsigned int utime;
unsigned int stime;
unsigned int cutime;
unsigned int cstime;
};
int GetCPUUseage(uint32_t & totalUse, uint32_t & curProcUse)
{
static CPUSnapShot last;
static ProcCPUSnapShot lastProc;
CPUSnapShot cur;
ProcCPUSnapShot curProc;
totalUse = cur.Total() == last.Total() ? 0 : ((cur.Total() - last.Total()) - (cur.idle - last.idle)) * 10000 / (cur.Total() - last.Total());
curProcUse = cur.Total() == last.Total() ? 0 : (curProc.Total() - lastProc.Total()) * 10000 / (cur.Total() - last.Total());
last = cur;
lastProc = curProc;
return 0;
}
int GetLoadAvg(uint32_t & loadavg)
{
char buff[256] = {0};
FILE * fd = fopen("/proc/loadavg", "r");
fgets(buff, sizeof(buff), fd);
fclose(fd);
float floadavg = 0.f;
sscanf(buff, "%f", &floadavg);
loadavg = uint32_t(floadavg * 100);
return 0;
}
int GetMemUseage(uint32_t & res, uint32_t & virt)
{
char strLinkFile[1024];
SPRINTF_SAFE(strLinkFile, "/proc/%d/status", getpid());
char buff[1024] = {0};
FILE * fd = fopen(strLinkFile, "r");
fread(buff, sizeof(buff), 1, fd);
fclose(fd);
char tmp1[256] = {0};
char tmp2[256] = {0};
char * p = NULL;
p = strstr(buff, "VmSize");
SAFE_TEST_RET_VAL(p, NULL, false);
sscanf(p, "%s %u %s", tmp1, &virt, tmp2);
p = strstr(buff, "VmRSS");
SAFE_TEST_RET_VAL(p, NULL, false);
sscanf(p, "%s %u %s", tmp1, &res, tmp2);
res /= 1024;
virt /= 1024;
return 0;
}
linux代码获取某个进程的cpu、内存
最新推荐文章于 2024-08-05 08:45:11 发布