C解析/proc/stat来计算每个核心的当前CPU使用情况



我为我的无能提前道歉。我要上的课需要这个,但C中的一切都超出了我的想象,我一直在努力坚持下去。

我试图解析/proc/stat中的信息,这样我就可以计算";当前";每个核心的CPU使用情况并打印出来。我将计算";当前";用法是从新版本的/proc/stat中减去旧版本的数字,然后将得到的数字添加到最新的集合中(至少我认为是这样,当我到达那里时,我会跨过这座桥(。无论如何,我有点困惑于如何解析这些信息。我知道结果是这样的:

cpu  1135030 3367 440838 5175504 85602 0 78716 0 0 0
cpu0 284682 935 110466 3027379 55475 0 27688 0 0 0
cpu1 282910 969 109421 719958 8029 0 22700 0 0 0
cpu2 284182 648 110727 715945 9275 0 16262 0 0 0
cpu3 283256 814 110223 712220 12822 0 12065 0 0 0

我知道最上面一行是所有核心的集合,行分别代表user、nice、system、idle、iowait、irq、softirq、steal、guest和guest_nice。

我的原始代码是:

int main() {
FILE *state1;
FILE *state2;
int oldNumbers[7];
int newNumbers[7];
state1 = fopen("/proc/stat", "r");
sleep(1);
state2 = fopen("/proc/stat", "r");
fscanf(state1, "%d %d %d %d %d %d %d", oldNumbers[0], oldNumbers[1], oldNumbers[2], oldNumbers[3], oldNumbers[4], oldNumbers[5], oldNumbers[6]);
fscanf(state2, "%d %d %d %d %d %d %d", newNumbers[0], newNumbers[1], newNumbers[2], newNumbers[3], newNumbers[4], newNumbers[5], newNumbers[6]);
fclose(state1);
fclose(state2);
return 0;
}

我明白为什么它不起作用,因为我的oldNumbers[]和newNumbers[]不是指针,但当我让它们成为指针时,它们也不起作用。也就是说,我完全不知道如何从这里继续前进,任何意见都将不胜感激。

感谢

  • 您不需要指向文件的两个指针,只需要一个,然后您就可以移回文件的开头进行第二次读取
  • 如前所述,您需要在fscanf()中使用指针
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *statFP;
int oldNumbers[7];
int newNumbers[7];
int diffNumbers[7];
char cpu[10];  // Not used
statFP = fopen("/proc/stat", "r");
fscanf(statFP,
"%s %d %d %d %d %d %d %d",
cpu,
&oldNumbers[0], 
&oldNumbers[1],
&oldNumbers[2],
&oldNumbers[3],
&oldNumbers[4],
&oldNumbers[5],
&oldNumbers[6]);
sleep(1);
rewind(statFP);
fscanf(statFP,
"%s %d %d %d %d %d %d %d",
cpu,
&newNumbers[0],
&newNumbers[1],
&newNumbers[2],
&newNumbers[3],
&newNumbers[4],
&newNumbers[5],
&newNumbers[6]);
fclose(statFP);
for (int ii = 0; ii < 7; ii++) {
diffNumbers[ii] = newNumbers[ii] - oldNumbers[ii];
printf("%d: %dn", ii, diffNumbers[ii]);
}
return 0;
}

另一个注意事项是,有一个名为sysstat的Linux包(https://github.com/sysstat/sysstat)它包含用于解析/proc中的信息的各种代码。它值得一看。

在扫描数字之前,您需要扫描过初始字符串。当然,fscanf需要指针。

fscanf(state1, "%*s %d %d %d %d %d %d %d", &oldNumbers[0], &oldNumbers[1], &oldNumbers[2], &oldNumbers[3], &oldNumbers[4], &oldNumbers[5], &oldNumbers[6]);
fscanf(state2, "%*s %d %d %d %d %d %d %d", &newNumbers[0], &newNumbers[1], &newNumbers[2], &newNumbers[3], &newNumbers[4], &newNumbers[5], &newNumbers[6]);

在那之后,你需要扫描剩下的3个数字,然后才能扫描下一行的输入(如果你打算这样做的话(。

而且,/proc在很大程度上是通过在读取文件时提供当前信息来工作的,而不是在打开文件时填充某些内容。因此,您需要读取第一个文件,然后等待一秒钟,然后读取第二个文件。

相关内容

  • 没有找到相关文章

最新更新