web-dev-qa-db-ja.com

コア数など、Linux上のCでCPU情報を取得するにはどうすればよいですか?

/proc/cpuinfoを解析するのではなく、何らかのAPIまたは関数によってそのような情報を取得することは可能ですか?

10
Mickey Shine

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 idcore id、およびcpu coresを解析して比較する必要があることに注意してください。また、httflagsがある場合は、ハイパースレッディングCPUを実行しているため、マイレージが異なる可能性があることに注意してください。

カーネルを仮想マシンで実行する場合、VMゲスト専用のCPUコアのみが表示されることにも注意してください。

10
Kimvais

これは、ほとんどすべての種類のLinuxディストリビューションに使用できます。

Cコードの場合

_ num_cpus = sysconf( _SC_NPROCESSORS_ONLN );
_

(QNXシステムでは、num_cpus = sysinfo_numcpu()を使用できます)

シェルスクリプトの場合、_cat /proc/cpuinfo_を使用できます

または、Linuxでlscpuまたはnprocコマンドを使用します

6
aditya dogra

/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機能を実装する関数です。

4
Pavan Manjunath

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;
}
4
talonmies

いいえそうではありません。 cpuinfoファイルを解析する必要があります。そうしないと、ライブラリによって解析されます。

1
Marko Kevac

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
1
Brent D.

ソースコードに次の行を追加します。

system("cat /proc/cpuinfo | grep processor | wc -l");

これにより、システム内のCPUの数が出力されます。また、このシステムコールのこの出力をプログラムで使用する場合は、popenシステムコールを使用してください。

1
Kunal

ファイル/ proc/cpuinfoを解析します。これにより、CPUに関する多くの詳細が得られます。関連するフィールドをC/C++ファイルに抽出します。

1
webgenius

このシェルコマンド「cat/proc/cpuinfo」の出力を見たことがありますか?そこでは、必要なすべての情報を入手できると思います。 Cプログラムで情報を読み取るには、fopen、fgetsなどのファイル操作関数を使用します。

0
seveves