C/C++获取操作系统、CPU、内存信息

操作系统和内存信息在windows下通过系统的API来获取,CPU信息则需要需要通过底层CPUID指令取得

#include <iostream>   
#include <string>  
#include <windows.h>    
  
#pragma warning(disable: 4996) // avoid GetVersionEx to be warned  
  
// ***** global macros ***** //  
static const int kMaxInfoBuffer = 256;  
#define  GBYTES  1073741824    
#define  MBYTES  1048576    
#define  KBYTES  1024    
#define  DKBYTES 1024.0    
  
// ---- get os info ---- //  
void getOsInfo()  
{  
    // get os name according to version number  
    OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)};  
    GetVersionEx(&osver);  
    std::string os_name;  
    if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)  
        os_name = "Windows 2000";  
    else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)  
        os_name = "Windows XP";  
    else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)  
        os_name = "Windows 2003";  
    else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)  
        os_name = "windows vista";  
    else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 1)  
        os_name = "windows 7";  
    else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 2)  
        os_name = "windows 10";  
      
    std::cout << "os name: " << os_name << std::endl;  
    std::cout << "os version: " << osver.dwMajorVersion << '.' << osver.dwMinorVersion << std::endl;  
  
}  
  
// ---- get cpu info ---- //  
// save 4 register variables  
DWORD deax;  
DWORD debx;  
DWORD decx;  
DWORD dedx;  
  
// init cpu in assembly language  
void initCpu(DWORD veax)    
{  
    __asm  
    {  
        mov eax, veax  
        cpuid  
            mov deax, eax  
            mov debx, ebx  
            mov decx, ecx  
            mov dedx, edx  
    }  
}  
  
long getCpuFreq()         
{  
    int start, over;  
    _asm  
    {  
        RDTSC  
        mov start, eax  
    }  
    Sleep(50);  
    _asm  
    {  
        RDTSC  
        mov over, eax  
    }  
    return (over - start) / 50000;  
}  
  
std::string getManufactureID()      
{  
    char manuID[25];  
    memset(manuID, 0, sizeof(manuID));  
  
    initCpu(0);          
    memcpy(manuID + 0, &debx, 4); // copy to array  
    memcpy(manuID + 4, &dedx, 4);  
    memcpy(manuID + 8, &decx, 4);  
  
    return manuID;  
}  
  
std::string getCpuType()  
{  
    const DWORD id = 0x80000002; // start 0x80000002 end to 0x80000004  
    char cpuType[49];  
    memset(cpuType, 0, sizeof(cpuType));  
  
    for (DWORD t = 0; t < 3; t++)  
    {  
        initCpu(id + t);  
          
        memcpy(cpuType + 16 * t + 0, &deax, 4);  
        memcpy(cpuType + 16 * t + 4, &debx, 4);  
        memcpy(cpuType + 16 * t + 8, &decx, 4);  
        memcpy(cpuType + 16 * t + 12, &dedx, 4);  
    }  
  
    return cpuType;  
}  
  
void getCpuInfo()  
{  
    std::cout << "CPU main frequency: " << getCpuFreq() << "MHz" << std::endl;  
    std::cout << "CPU manufacture: " << getManufactureID() << std::endl;  
    std::cout << "CPU type: " << getCpuType() << std::endl;  
}  
  
// ---- get memory info ---- //  
void getMemoryInfo()  
{  
    std::string memory_info;  
    MEMORYSTATUSEX statusex;  
    statusex.dwLength = sizeof(statusex);  
    if (GlobalMemoryStatusEx(&statusex))  
    {  
        unsigned long long total = 0, remain_total = 0, avl = 0, remain_avl = 0;  
        double decimal_total = 0, decimal_avl = 0;  
        remain_total = statusex.ullTotalPhys % GBYTES;  
        total = statusex.ullTotalPhys / GBYTES;  
        avl = statusex.ullAvailPhys / GBYTES;  
        remain_avl = statusex.ullAvailPhys % GBYTES;  
        if (remain_total > 0)  
            decimal_total = (remain_total / MBYTES) / DKBYTES;  
        if (remain_avl > 0)  
            decimal_avl = (remain_avl / MBYTES) / DKBYTES;  
  
        decimal_total += (double)total;  
        decimal_avl += (double)avl;  
        char  buffer[kMaxInfoBuffer];  
        sprintf_s(buffer, kMaxInfoBuffer, "total %.2f GB (%.2f GB available)", decimal_total, decimal_avl);  
        memory_info.append(buffer);  
    }  
    std::cout << memory_info << std::endl;  
}  
  
int main(int argc, char *argv[])  
{  
    std::cout << "===os information===" << std::endl;  
    getOsInfo();  
  
    std::cout << "===cpu infomation===" << std::endl;  
    getCpuInfo();  
  
    std::cout << "===memory information===" << std::endl;  
    getMemoryInfo();  
  
    system("pause");  
    return 0;  
} 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C/C++语言中,可以通过不同的方法获取操作系统CPU内存信息,具体取决于运行的操作系统是Windows还是Linux。 对于Windows操作系统,可以使用WinAPI提供的函数来获取系统信息。以下是获取操作系统CPU内存信息的示例代码: 1. 获取操作系统信息: ```c #include <Windows.h> #include <stdio.h> int main() { OSVERSIONINFOEX osVersionInfo; ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX)); osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (GetVersionEx((OSVERSIONINFO*)&osVersionInfo)) { printf("操作系统版本:%d.%d\n", osVersionInfo.dwMajorVersion, osVersionInfo.dwMinorVersion); printf("Service Pack:%s\n", osVersionInfo.szCSDVersion); } return 0; } ``` 2. 获取CPU信息: ```c #include <Windows.h> #include <stdio.h> int main() { SYSTEM_INFO systemInfo; GetSystemInfo(&systemInfo); printf("CPU核心数:%d\n", systemInfo.dwNumberOfProcessors); return 0; } ``` 3. 获取内存信息: ```c #include <Windows.h> #include <stdio.h> int main() { MEMORYSTATUSEX memoryStatus; ZeroMemory(&memoryStatus, sizeof(MEMORYSTATUSEX)); memoryStatus.dwLength = sizeof(MEMORYSTATUSEX); if (GlobalMemoryStatusEx(&memoryStatus)) { printf("物理内存总量:%I64d MB\n", memoryStatus.ullTotalPhys / (1024 * 1024)); printf("可用物理内存:%I64d MB\n", memoryStatus.ullAvailPhys / (1024 * 1024)); } return 0; } ``` 对于Linux操作系统,可以使用相应的系统命令或读取系统文件来获取信息。以下是获取操作系统CPU内存信息的示例代码: 1. 获取操作系统信息: ```c #include <stdio.h> int main() { FILE* fp = popen("uname -a", "r"); if (fp) { char buffer[1024]; if (fgets(buffer, sizeof(buffer) - 1, fp)) { printf("操作系统信息:%s\n", buffer); } pclose(fp); } return 0; } ``` 2. 获取CPU信息: ```c #include <stdio.h> int main() { FILE* fp = popen("cat /proc/cpuinfo | grep 'processor' | wc -l", "r"); if (fp) { char buffer[1024]; if (fgets(buffer, sizeof(buffer) - 1, fp)) { printf("CPU核心数:%s", buffer); } pclose(fp); } return 0; } ``` 3. 获取内存信息: ```c #include <stdio.h> int main() { FILE* fp = popen("free -m | grep 'Mem' | awk '{print $2}'", "r"); if (fp) { char buffer[1024]; if (fgets(buffer, sizeof(buffer) - 1, fp)) { printf("物理内存总量:%s MB\n", buffer); } pclose(fp); } return 0; } ``` 以上代码只是演示了获取部分信息,实际可以根据需求获取更详细的系统、CPU内存信息

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值