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<fileLen)
{
if(buffer[i]=='\r')
n++;
i++;
}


num = n-1; // 第一行是列名,要减去
delete buffer;
return 0;
}


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值