在Linux上用C语言获取CPU信息,例如核心数量?

12

有没有可能通过一些API或函数获取这样的信息,而不是解析/proc/cpuinfo


1
重复的问题。请查看答案:https://dev59.com/TW455IYBdhLWcg3wAvXQ#55304841 - Zibri
9个回答

12

来自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核心数之间的差异,您需要解析和比较物理ID、核心ID和CPU核心数,以获取准确结果。同时请注意,如果在“flags”中有“htt”,则表示您正在运行支持超线程技术的CPU,这意味着您的性能可能会有所不同。
另请注意,如果您在虚拟机中运行内核,则只能看到为虚拟机客户端分配的CPU核心。

好奇的问题。谁更新这个文件? - Laz
1
@RamBhat - 一般情况下它不是“文件”。请参阅维基百科关于procfs的文章。 - Kimvais
我发现这篇文章对于理解/proc/cpuinfo文件非常有帮助 - http://www.richweb.com/cpu_info - warunapww

10

您可将其用于大多数Linux发行版

对于C代码

 num_cpus = sysconf( _SC_NPROCESSORS_ONLN );

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

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

或在 Linux 中使用 lscpunproc 命令


1
这是最“编程式”的、可能最简单的方法;尽管man sysconf()指定该值“可能不是标准的”。 - Mark
1
对于那些在寻求QNX帮助的人们 - 在基本的qnx660中没有sysinfo_numcpu()方法。 - rasjani

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

该库在我的Linux操作系统上无法直接编译。 - Kimvais
1
@Kimvais:我能说的就是它对我起作用。 - talonmies
是的,我没有真正排除故障,只是执行了 configure && make && sudo make install 命令,但是 make 失败了,可能是一些非常简单的问题 :) - Kimvais

4

阅读/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功能的函数。


2
在您的源代码中添加以下行...
system("cat /proc/cpuinfo | grep processor | wc -l");

这将打印出您系统中的CPU数量。如果您想在程序中使用此系统调用的输出,则可以使用popen系统调用。


不是的,这也会计算超线程,请阅读http://www.richweb.com/cpu_info以获取有关解码/proc/cpuinfo文件的详细信息。 - warunapww
线程:cat /proc/cpuinfo | grep -c "cpu cores" ## 核心数:cat /proc/cpuinfo | grep -m 1 "cpu cores"|cut -d ":" -f 2 - Zibri

1
解析文件/proc/cpuinfo。这将为您提供有关CPU的许多详细信息。将相关字段提取到您的C/C++文件中。

有没有适合读取该文件的任何库? - hunter_tech

1
不是的。你要么必须解析cpuinfo文件,要么使用一些库来完成它。

1
根据你所使用的Linux版本,/proc/cpuid会返回不同的结果。
在CentOS上,以下命令可用于获取CPU总核心数。
cat /proc/cpuinfo | grep -w cores | sed -e 's/\t//g' | awk '{print $3}' | xargs | sed -e 's/\ /+/g' | bc

在Ubuntu中不起作用。对于Ubuntu,您可以使用以下命令。
nproc

滥用 cat 是没有意义的。以下代码可以正常工作:grep -m1 "cores" /proc/cpuinfo | tr -d '[a-z]:[:space:]' - Yokai
这是用于shell的。OP问如何在C语言中以编程方式实现,而不是在shell中。 - Brian Reading

0
你有没有看过这个shell命令“cat /proc/cpuinfo”的输出?我认为你可以在那里获取所有需要的信息。 如果要在C程序中读取信息,我更喜欢使用文件操作函数,如fopen、fgets等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接