#include <sys/sysinfo.h>
#include <sys/statfs.h>
#include <fstream>
#include <string.h>
uint64_t lastTotalUser = 0, lastTotalUserLow= 0, lastTotalSys= 0, lastTotalIdle= 0;
double GetCPUUsedRatio()
{
/// @brief 获取cpu使用率的百分比
unsigned long long totalUser, totalUserLow, totalSys, totalIdle, total;
static double percent = 100.0;
FILE* procfile = fopen("/proc/stat", "r");
if(!procfile)
{
printf("open stat fail
");
return 0;
}
fscanf(procfile, "cpu %llu %llu %llu %llu", &totalUser, &totalUserLow, &totalSys, &totalIdle);
fclose(procfile);
if (totalUser < lastTotalUser || totalUserLow < lastTotalUserLow ||
totalSys < lastTotalSys || totalIdle < lastTotalIdle)
{
//Overflow detection. Just skip this value.
//percent = -1.0;
}
else
{
total = (totalUser - lastTotalUser) + (totalUserLow - lastTotalUserLow) + (totalSys - lastTotalSys);
double temp_percent = total;
total += (totalIdle - lastTotalIdle);
temp_percent /= total;
temp_percent *= 100;
if(temp_percent > 0 && temp_percent < 100.1)
{
percent = temp_percent;
}
}
lastTotalUser = totalUser;
lastTotalUserLow = totalUserLow;
lastTotalSys = totalSys;
lastTotalIdle = totalIdle;
return percent;
}
double GetMemoryUsedRatio()
{
/// @brief 获取memory使用率的百分比
FILE* procfile = fopen("/proc/meminfo", "r");
if(!procfile)
{
printf("open meminfo fail
");
return 0;
}
size_t i=0,j=0;
size_t buflen;
char *pbuffer=NULL;
char tmpBuffer[32];
uint64_t nMemTotal = 0;
uint64_t nMemAvailable = 0;
while (getline(&pbuffer, &buflen, procfile)!=-1)
{
if(strstr(pbuffer,"MemTotal")!=NULL)
{
memset(tmpBuffer,0,sizeof(tmpBuffer));
for(i=0,j=0;i<strlen(pbuffer);i++)
{
if(isdigit(pbuffer[i]))
{
tmpBuffer[j++]=pbuffer[i];
}
}
nMemTotal=atoi(tmpBuffer);
}
if(strstr(pbuffer,"MemAvailable:")!=NULL)
{
memset(tmpBuffer,0,sizeof(tmpBuffer));
for(i=0,j=0;i<strlen(pbuffer);i++)
{
if(isdigit(pbuffer[i]))
{
tmpBuffer[j++]=pbuffer[i];
}
}
nMemAvailable=atoi(tmpBuffer);
}
if(nMemTotal && nMemAvailable)
{
break;
}
}
fclose(procfile);
if (pbuffer!=NULL)
{
free(pbuffer);
pbuffer = NULL;
}
double value = ((nMemTotal-nMemAvailable) / (double)nMemTotal) * 100;
return value;
}