以一秒为间隔计算并返回CPU使用率

问题描述

我正在尝试构建一个函数,该函数将在1秒的时间内返回我的VM处理器的cpu使用率。目标是使用基本的C库函数。该方法有3个参数:路径,cpu_stats * prev结构和cpu_stats * curr结构。两种结构都用于存储先前值和当前值,因此该方法只要运行两次就可以变得准确。我似乎遇到的问题是关于准确返回值。现在,我正在添加/ proc / stat第一行的每个值,并将其用作我的总值,并将第三列的值作为我的空闲值(不知道是否是这个值,不同的站点会给出不同的答案每列是什么)。让我知道您是否知道从哪里开始以及要进行哪些更改。目前,我的代码经过的所有测试均表明我的结果始终为100.0%,但预期值约为32.2%/ 72.1%/ 49.0%/ etc ...

这是我的代码

double pfs_cpu_usage(char *proc_dir,struct cpu_stats *prev,struct cpu_stats *curr)
{
    long idleOne,idleTwo,totalOne,totalTwo=0;
    idleOne = prev->idle;
    totalOne = prev->total;
    int fd = open_path(proc_dir,"stat");
    if (fd <= 0) {
        perror("open_path");
        return -1;
}

size_t line_sz = 0;
char line[256];
while ((line_sz = one_lineread(fd,line,256)) > 0) {
    char *next_tok = line;
    char *curr_tok;
    char *endPtr;
    int counter = 1;
    while ((curr_tok = next_token(&next_tok,"\n\t: ")) != NULL) {
        if(counter == 5) {
           counter++;
           idleTwo = strtol(curr_tok,&endPtr,32);
           curr->idle = idleTwo;
        }
        else if(strcmp(curr_tok,"cpu") == 0){
            counter++;
        }
        else{
            counter++;
            totalTwo += strtol(curr_tok,32);
            curr->total = totalTwo;
        }
    }
}
long diffIdle = idleTwo - idleOne;
long diffTotal = totalTwo - totalOne;
double cpuUsage = (1.0 - ((double)diffIdle)*1.0/((double)diffTotal)*100);
close(fd);
return cpuUsage;
}

这是我的/ proc / stat文件的第一行:

cpu  12836188 17450 280277082 121169501 1538 0 2490 5206 0 0

显然,我的调试似乎不存储所存储的空闲值。

解决方法

好,那么这篇文章? https://stackoverflow.com/a/23376195/13307070

此答案基于https://htop.dev/,使用/proc/stat