版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_14976351/article/details/75088407
1.简介
上一篇介绍了如何通过cpuid指令获取CPU信息,本文主要介绍如何通过读取/proc/cpuinfo文件获取CPU信息。本文从“什么是/proc文件系统”,“如何从cpuinfo文件获取cpu信息”“实验结果”三个方面展开阐述。
2.什么是/proc文件系统?
/proc文件系统是一种内核和内核模块用来向进程(process)发送消息的机制,可以让用户能够和内核内部数据结构进行交互,获取有关进程的信息。它与其他文件系统不同,它是一个伪文件系统,它不存在硬盘上,而是存储在内存中。所以,当查看该文件大小时,文件大小显示为0字节。
/proc目录下的文件记录了内核状态信息、计算机属性、正在运行的进程状态信息等,它存储了系统最新的系统物理环境信息。/proc文件系统可以用于收集系统和运行中的内核信息,以下为一些重要的文件:
- /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等)
- /proc/meminfo - 物理内存、交换空间等的信息
- /proc/mounts - 已加载的文件系统的列表
- /proc/devices - 可用设备的列表
- /proc/filesystems - 被支持的文件系统
- /proc/modules - 已加载的模块
- /proc/version - 内核版本
- /proc/cmdline - 系统启动时输入的内核命令行参数
3.读取/proc/cpuinfo
首先用cat程序打开cpuinfo文件:
本文以vendor_id,model,model name,cpu family为例展开介绍。 以下为详细代码:
void FillCPUStruct(PCPU_INFO cpuInfo)
{
FILE *fp;
int nread = 0;
char *file = "/proc/cpuinfo";
char *buffer = NULL;
char content[40]="";
size_t len = 0;
fp = fopen(file,"rb");
if(fp == NULL)
{
printf("error happen to open:%s\n",file);
return;
}
while(nread=getline(&buffer,&len,fp)!=-1)
{
if(strstr(buffer,"vendor_id")!=NULL)
{
buffer[strlen(buffer)-1]=0;
sscanf(buffer,"%s%s%s",content,content,content);
strcpy(cpuInfo->Company,content);
}
if(strstr(buffer,"cpu family")!=NULL)
{
buffer[strlen(buffer)-1]=0;
//printf("len:buffer=%d:%d\n",len,strlen(buffer));
sscanf(buffer,"%s%s%s%s",content,content,content,content);
strcpy(cpuInfo->Family,content);
printf("cpu family=%s\n",content);
}
if(strstr(buffer,"model")!=NULL)
{
if(strstr(buffer,"model name")!=NULL)
{
buffer[strlen(buffer)-1]=0;
//printf("model name buffer=%s\n",buffer);
char *ptr = strchr(buffer,':');
printf("model name buffer=%s\n",buffer);
//strncpy(content,(char*)&buffer+strstr(buffer,":"),strlen(buffer));
//sscanf(buffer,"%s%s%s%s",content,content,content,content);
strcpy(content,buffer+(ptr-buffer)+2);
strcpy(cpuInfo->Brand,content);
//printf("model name=%s\n",buffer+(ptr-buffer)+2);
}else{
buffer[strlen(buffer)-1]=0;
printf("model buffer=%s\n",buffer);
sscanf(buffer,"%s%s%s",content,content,content);
strcpy(cpuInfo->Model,content);
printf("model=%s\n",content);
}
}
}
}