问题描述
我正在尝试构建一个函数,该函数将在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