通过文件获得Linux下CPU使用率

33 篇文章 3 订阅
本文介绍了如何在不使用top命令的情况下,通过读取/proc/stat文件获取Linux系统的CPU利用率。方法是解析文件中第一行的数据,计算出空闲时间和总CPU时间,然后通过间隔读取两次文件并计算差值来得到CPU使用率。程序示例提供了读取和计算的实现,并展示了如何计算平均CPU使用率。若要计算各CPU核心的使用率,只需扩展此方法处理所有CPU条目。
摘要由CSDN通过智能技术生成

我要获得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的时间进行计算。取值的间隔也可以更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值