【问题标题】:C Parsing /proc/stat to calculate current CPU usage for each coreC 解析 /proc/stat 以计算每个核心的当前 CPU 使用率
【发布时间】:2025-11-29 11:20:23
【问题描述】:

我提前为我的无能道歉。我在上一门课时需要这个,但 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、steel、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[] 不是指针,但是当我使它们成为指针时,它们也不起作用。也就是说,我完全不知道如何从这里继续前进,我们将不胜感激。

谢谢

【问题讨论】:

    标签: c ubuntu cpu-usage


    【解决方案1】:

    至少,您需要先扫描初始字符串,然后才能扫描数字。当然,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 主要通过在您阅读文件时提供当前信息来工作,而不是在您打开文件时填充某些内容。因此,您需要读取第一个文件,然后等待一秒钟,然后再读取第二个文件。

    【讨论】:

    • 非常感谢您的帮助!这让这看起来容易多了。你是救生员,朋友
    【解决方案2】:
    • 您不需要两个指向文件的指针,只需要一个,然后您可以回到文件开头进行第二次读取。
    • 如前所述,您需要在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: %d\n", ii, diffNumbers[ii]);
        }
        return 0;
    }
    

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

    【讨论】: