【国产桌面操作系统开发】获取系统硬件信息

时间:2024-11-19 17:20:03

前言

        工具型的项目,多少要跟硬件打交道,我在国产系统中开发的QT项目也多是工具,下面罗列涉及到与硬件相关的开发调研项。

获取CPU信息

lscpu

可以列举出芯片等信息,cat /proc/cpuinfo可以更详细一些的内容,但有用度低。

dmidecode

dmidecode主要是存储硬件设备厂商按照标准化填写的硬件信息,信息非常丰富,比如可以获取到CPU的ID和序列号,作为本系统的唯一值(比如注册激活功能会用到):

//获取CPU ID
dmidecode -t Processor | grep ID |head -n1 |awk -F 'ID:' '{print $2}' 
//获取CPU 序列号
dmidecode -t Processor | grep Serial |awk -F ': ' '{print $2}'

获取CPU名称:

dmidecode -t processor|grep Manufacturer|awk -F ':' '{print $2}'

获取内存信息

通过文件/proc/meminfo获取,内存总大小可以通过累加获取


std::string getMemTotal()
{
    std::string result = "0";
    char cmdstr[100]="cat /proc/meminfo |grep MemTotal";
    char buffer[128]={0};

    FILE* pipe = popen(cmdstr, "r");
    if (!pipe) {
        std::cerr << "Error opening pipe" << std::endl;
        return "";
    }
    while (fgets(buffer, 128, pipe) != NULL) {
        //std::cout << "buffer: " << buffer << std::endl;
        // 按照 ' ' 分割字符串  MemTotal:        8082664 kB
        std::vector<std::string> strlist = split(buffer, ':');
        if(strlist.size()<2) continue;
        //std::cout << "buffer: " << strlist[1] << std::endl;
        std::string memorystr=strlist[1];
        int number = std::atoi(memorystr.c_str());
        //double size = number/1024/1024.0;
        int size = number/1000/1000;
        result = std::to_string(size);
    }
    pclose(pipe);
    result += "GB";
}

获取硬盘大小

通过命令lsblk获取,也是通过累加方式

std::string getDisksize(){
    std::string result = "";
    char cmdstr[100]="lsblk|grep disk|awk -F ' ' '{print $4}'|tr -d '\n'";
    char buffer[128]={0};

    FILE* pipe = popen(cmdstr, "r");
    if (!pipe) {
        std::cerr << "Error opening pipe" << std::endl;
        return "";
    }
    while (fgets(buffer, 128, pipe) != NULL) {
        result += buffer;
    }
    pclose(pipe);
    return result;
}

获取本地IP地址

通过hostname获取:hostname -I|awk -F ' ' '{print $1}'

获取系统名称

通过hostnamectl获取:hostnamectl |grep Operating|awk -F ':' '{print $2}'