簡體   English   中英

C 解析 /proc/stat 計算每個核心的當前 CPU 使用率

[英]C Parsing /proc/stat to calculate current CPU usage for each core

我提前為我的無能道歉。 我需要這個用於我正在服用的 class,但 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[] 不是指針,但是當我使它們成為指針時,它們也不起作用。 也就是說,我完全不知道如何從這里繼續前進,任何輸入將不勝感激。

謝謝

  • 您不需要兩個指向文件的指針,只需要一個,然后您可以回到文件的開頭進行第二次讀取。
  • 如前所述,您需要在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;
}

另外需要注意的是,在 /proc 中有一個名為sysstat的 Linux package ( https://github.com/sysstat/sysstat ),其中包含用於解析各種代碼的信息。 值得一看。

最低限度,您需要先掃描初始字符串,然后才能掃描數字。 當然, 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主要通過在您閱讀文件時提供當前信息來工作,而不是在您打開文件時填充某些內容。 因此,您需要讀取第一個文件,然后等待一秒鍾,然后再讀取第二個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM