如何在Linux上获取C中的CPU信息,例如内核数量?

Mic*_*ine 10 c linux cpu operating-system

是否可以通过某些API或函数获取此类信息,而不是解析/proc/cpuinfo

Kim*_*ais 10

来自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.
Run Code Online (Sandbox Code Playgroud)

下面是示例代码,用于读取和打印信息到控制台,从论坛中窃取 - 它实际上只是一个专门的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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您真的关心CPU数量与CPU核心数量,则需要对其进行解析和比较physical id,core idcpu cores获得准确的结果.另请注意,如果有httin flags,则表示您正在运行超线程CPU,这意味着您的里程可能会有所不同.

另请注意,如果在虚拟机中运行内核,则只能看到专用于VM guest虚拟机的CPU内核.


小智 6

您可以将它用于大多数类型的Linux发行版

对于C代码

 num_cpus = sysconf( _SC_NPROCESSORS_ONLN );
Run Code Online (Sandbox Code Playgroud)

(在QNX系统中,您可以使用num_cpus = sysinfo_numcpu())

对于shell脚本,您可以使用 cat /proc/cpuinfo

或在linux中使用lscpunproc命令


tal*_*ies 5

libcpuid提供了一个简单的 API,它将直接返回所有 CPU 特性,包括内核数。要在运行时获取内核数,您可以执行以下操作:

#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;
}
Run Code Online (Sandbox Code Playgroud)