Mic*_*ine 10 c linux cpu operating-system
是否可以通过某些API或函数获取此类信息,而不是解析/proc/cpuinfo?
Kim*_*ais 10
来自man 5 proc:
Run Code Online (Sandbox Code Playgroud)/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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您真的关心CPU数量与CPU核心数量,则需要对其进行解析和比较physical id,core id并cpu 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中使用lscpu或nproc命令
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)