我要获得CPU的利用率,但是不能使用top命令,于是上网查询后,发现CPU信息存储在/proc/stat文件中,它的内容是这样的。
具体含义网上有很多介绍,我只关心总的CPU使用情况,所有只使用第一行数据即可。第一行所有值加起来就是总的CPU运行时间,其中127411844这个值是空闲时间,用(1-空闲时间/总时间)*100即可得到CPU使用率的百分比。
文件中的值是指开机到目前的总时间,为了获得类似top效果的使用率,需要间隔一段时间读取两次,用第二次获得的结果减去第一次获得的结果,然后就能算出这段时间的CPU使用率
平均CPU使用率 = (1 - (空闲时间_new - 空闲时间_old)/(总CPU时间_new - 总CPU时间_old))*100
程序读取文件的第一行,然后通过正则表达式取出所有数字,其中空闲时间单独保存,再将数字加起来得到总时间。取两次计算间隔,这里取1秒间隔,然后再计算使用率。
void GetCPUTime(long& totalCPU, long &idleCPU)
{
ifstream cpuFile("/proc/stat");
if (!cpuFile) {
cout << "open stat file error" << endl;
return ;
}
char cpuInfo[128];
cpuFile.getline(cpuInfo, sizeof(cpuInfo));
cpuFile.close();
smatch result;
regex pattern("([0-9]+)");
string cpuStr = cpuInfo;
string::const_iterator iStart = cpuStr.begin();
string::const_iterator iEnd = cpuStr.end();
long totalCpu=0;
long totalIdel = 0;
int index = 0;
while (regex_search(iStart, iEnd, result, pattern)) //正则表达式依次读取每个数字
{
if (index == IDLE_INDEX) //得到空闲时间
{
totalIdel = std::stol(result.str());
}
index++;
totalCpu += std::stol(result.str());
iStart = result[0].second; //result[0].first指向本次匹配开始的地方,result[0].second指向本次匹配结束的地方,这里为了向后移动指针
}
totalCPU = totalCpu;
idleCPU = totalIdel;
}
int main()
{
long total_old = 0;
long idle_old = 1;
long total_new = 0;
long idle_new = 2;
GetCPUTime(total_old, idle_old);
std::this_thread::sleep_for(std::chrono::seconds(1));
GetCPUTime(total_new, idle_new);
double rate = 100.0 - 100.0*(idle_new - idle_old)/(total_new - total_old);
cout<<rate<<endl;
return 0;
}
如果要计算CPU各个核的使用率,则是仿照上面的方法,取文件中每个CPU的时间进行计算。取值的间隔也可以更改。