通过读取/proc/cpuinfo获取CPU信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
            }

        }

    }
}

4.运行结果

这里写图片描述
完整代码地址

猜你喜欢

转载自blog.csdn.net/qq_14976351/article/details/75088407