ファイル(特に/ proc/stat)を読み込んでデータを取得しようとしています。 Cでこれを行う方法はたくさんありますが、(これまでのところ)私はfscanf()
を使っています。 (しかし、私は特にそれに縛られていません - それはちょうど私がやりたいことに適しているようですが、他に良い方法があればそれを提案してください)。私が見ている問題は、fscanf()
が1行(特定のフォーマット文字列)を読み込みますが、別の行をターゲットにするようにフォーマット文字列を変更するとデータを収集することを拒否することです。例は、これをはるかに明確にします。fscanfは1行にマッチしますが、別の行には似ていません
#include <stdio.h>
char *
get_cpu_perc() {
unsigned long long cpu0_user=0;
FILE* file = fopen("/proc/stat", "r");
int fsf_ret;
fsf_ret = fscanf(file, "cpu %llu", &cpu0_user);
printf("%llu\n", cpu0_user);
printf("%d\n", fsf_ret);
return cpu0_user;
}
int
main(){
get_cpu_perc();
return 1;
}
上記はうまくいく - 「cpu」で始まる行の最初の番号を選択する。私はコアごとの合計にこれを分割したい - 私は関数fscanfをチャゲする必要がmeanining()しかし、私はそのライン上の任意の一致を得ることはありません
fscanf(file, "cpu0 %llu", &cpu0_user);
に呼び出します。それはおそらく明らかですが、Cについては非常に緑色です(これは私が習得したくないと言っているわけではありませんが、私はこれが実際にどのように行われるべきかについては未熟ではありません)。
これは実際には* nix固有の問題ではないので、以下はlive/proc/statに対してこれを実行するときの動作を複製する行です。もしあなたがそう思ったら、あなたはこれを保存して、それに対してテストすることができます。
cpu 5885032 59114 1477054 15427556 39113 0 36078 0 0 0
cpu0 2888239 29861 682033 7814849 22952 0 24266 0 0 0
cpu1 2996792 29253 795020 7612706 16160 0 11812 0 0 0
私の質問はこれです:どのように私は最初の2行目と3行目照合していないために)(関数fscanfを得るのですか? (これは恐らくthis questionに関連しているかもしれませんが、正直なところ - 私は何もしていないし、正規表現を使っていないかもしれません)。
あなたはファイルをfcloseすることを忘れています。これは、ループからget_cpu_perc()を呼び出すと、最終的にはファイル記述子の不足につながります。 – wildplasser