/proc/cpuinfo
を解析するのではなく、何らかのAPIまたは関数によってそのような情報を取得することは可能ですか?
man 5 proc
から:
/proc/cpuinfo This is a collection of CPU and system architecture dependent items, for each supported architecture a different list. Two common entries are processor which gives CPU number and bogomips; a system constant that is calculated during kernel initialization. SMP machines have information for each CPU.
これは、情報を読み取ってコンソールに出力するサンプルコードです。 フォーラムから盗まれました -これは、実際には特殊なcat
コマンドです。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *cpuinfo = fopen("/proc/cpuinfo", "rb");
char *arg = 0;
size_t size = 0;
while(getdelim(&arg, &size, 0, cpuinfo) != -1)
{
puts(arg);
}
free(arg);
fclose(cpuinfo);
return 0;
}
CPUの数とCPUコアの数を本当に気にする場合は、正確な結果を得るには、physical id
、core id
、およびcpu cores
を解析して比較する必要があることに注意してください。また、htt
にflags
がある場合は、ハイパースレッディングCPUを実行しているため、マイレージが異なる可能性があることに注意してください。
カーネルを仮想マシンで実行する場合、VMゲスト専用のCPUコアのみが表示されることにも注意してください。
これは、ほとんどすべての種類のLinuxディストリビューションに使用できます。
Cコードの場合
_ num_cpus = sysconf( _SC_NPROCESSORS_ONLN );
_
(QNXシステムでは、num_cpus = sysinfo_numcpu()
を使用できます)
シェルスクリプトの場合、_cat /proc/cpuinfo
_を使用できます
または、Linuxでlscpu
またはnproc
コマンドを使用します
/proc/cpuinfo
を読む
サンプル出力
processor : 0
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
processor : 1
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 4
processor : 2
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
processor : 3
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
show_cpuinfo は、実際に/proc/cpuinfo
機能を実装する関数です。
libcpuid
は、コア数を含むすべてのCPU機能を直接返すシンプルなAPIを提供します。実行時にコアの数を取得するには、次のようにします。
#include <stdio.h>
#include <libcpuid.h>
int main(void)
{
if (!cpuid_present()) {
printf("Sorry, your CPU doesn't support CPUID!\n");
return -1;
}
struct cpu_raw_data_t raw;
struct cpu_id_t data;
if (cpuid_get_raw_data(&raw) < 0) {
printf("Sorry, cannot get the CPUID raw data.\n");
printf("Error: %s\n", cpuid_error());
return -2;
}
if (cpu_identify(&raw, &data) < 0) {
printf("Sorrry, CPU identification failed.\n");
printf("Error: %s\n", cpuid_error());
return -3;
}
printf("Processor has %d physical cores\n", data.num_cores);
return 0;
}
いいえそうではありません。 cpuinfoファイルを解析する必要があります。そうしないと、ライブラリによって解析されます。
Linuxのフレーバーに応じて、/ proc/cpuidから異なる結果が得られます。
これは、CentOSでコアの総数を取得するために機能します。
cat /proc/cpuinfo | grep -w cores | sed -e 's/\t//g' | awk '{print $3}' | xargs | sed -e 's/\ /+/g' | bc
同じことはUbuntuでは機能しません。 Ubuntuの場合、次のコマンドを使用できます。
nproc
ソースコードに次の行を追加します。
system("cat /proc/cpuinfo | grep processor | wc -l");
これにより、システム内のCPUの数が出力されます。また、このシステムコールのこの出力をプログラムで使用する場合は、popenシステムコールを使用してください。
ファイル/ proc/cpuinfoを解析します。これにより、CPUに関する多くの詳細が得られます。関連するフィールドをC/C++ファイルに抽出します。
このシェルコマンド「cat/proc/cpuinfo」の出力を見たことがありますか?そこでは、必要なすべての情報を入手できると思います。 Cプログラムで情報を読み取るには、fopen、fgetsなどのファイル操作関数を使用します。