Windows如何得到物理CPU的数目

  • 最近一直忙运维Agent程序,其中一个指标是查询目标设备的物理CPU数量。查询API和网上同行的帖子都没能解决。
  • 使用API的GetSystemInfo函数得到的是逻辑CPU数量,若机器是1个4核CPU,则查到的就是4,若机器是2个2核CPU,则查到也是4,所以没法代表物理CPU数量。
  • 使用cmd工具执行“systeminfo”命令,在打印的结果中有"处理器:  安装了 1 个处理器",在一个设置了2个物理CPU的windows虚拟机中执行,在打印的结果中有"处理器:  安装了 2 个处理器",再通过程序解析可以解决问题。
  • 我用了另一种方法,分别在带1个物理CPU的机器和2个物理CPU的机器的cmd工具中执行“wmic cpu get > c:\cpuinfo.txt”命令,将命令的执行结果放到c:\cpuinfo.txt文件中(文件带格式),打开文件发现带1个物理CPU的文件内容只有1行(第一行列名不算),带1个物理CPU的文件内容有2行,故而从行数上可以得出物理CPU数量。。。而且,文件内容比较丰富,可以解析得到更加具体的信息。

结果如图:








程序如下:(形参num就是要得到的物理CPU数目)

int GetPhyCpuNum(int &num)
{
// -------------------- 得到当前路径 ---------------------
char path[256]={0};
char exePath[256]={0};
GetModuleFileName(NULL,exePath,sizeof(exePath));
//printf("%s\r\n",exePath);

int len=0;
len = strlen(exePath);


int i;
for(i=len-1; i>0; i--)
{
if(exePath[i] == '\\')
break;
}
if(i==0)
return -1;
else
{
strncpy(path,exePath,i+1);
strcat(path,"cpuinfo.txt");
}

// ------------------- 发送wmic命令查询 结果放到文件中-------------------
//printf("%s\r\n",path);
char cmd[512]={0};
sprintf(cmd,"wmic cpu get > %s",path);//printf("%s\r\n",cmd);
system(cmd);
Sleep(3000);


// ------------------- 读文件内容到数组中 -------------------
FILE *fp=NULL;
int fileLen;


fp = fopen(path,"r");
if(fp==NULL)
{
return -2;
}
fseek(fp,0,SEEK_END); // 定位到文件末
fileLen=ftell(fp); // 得到文件大小 
if(fileLen==0)
{
fclose(fp);
return -3;
}
fseek(fp,0L,SEEK_SET); // 定位到文件开头
char *buffer = new char[fileLen+1];
fread(buffer,fileLen,1,fp); // 一次性读取全部文件内容
buffer[fileLen]='\0'; // 字符串结束标志
fclose(fp);


// ------------------- 查询行数 -----------------------------
i=0;
int n=0;
while(i


你可能感兴趣的:(windows)