有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,cpu,内存,显卡,硬盘等,作为后续软件功能判断的依据,甚至参与性能算法自适应建模

Windows

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

代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h>
  4. #pragma warning(disable: 4996) // avoid GetVersionEx to be warned
  5. // ***** global macros ***** //
  6. static const int kMaxInfoBuffer = 256;
  7. #define  GBYTES  1073741824
  8. #define  MBYTES  1048576
  9. #define  KBYTES  1024
  10. #define  DKBYTES 1024.0
  11. // ---- get os info ---- //
  12. void getOsInfo()
  13. {
  14. // get os name according to version number
  15. OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)};
  16. GetVersionEx(&osver);
  17. std::string os_name;
  18. if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)
  19. os_name = "Windows 2000";
  20. else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)
  21. os_name = "Windows XP";
  22. else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)
  23. os_name = "Windows 2003";
  24. else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)
  25. os_name = "windows vista";
  26. else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 1)
  27. os_name = "windows 7";
  28. else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 2)
  29. os_name = "windows 10";
  30. std::cout << "os name: " << os_name << std::endl;
  31. std::cout << "os version: " << osver.dwMajorVersion << '.' << osver.dwMinorVersion << std::endl;
  32. }
  33. // ---- get cpu info ---- //
  34. // save 4 register variables
  35. DWORD deax;
  36. DWORD debx;
  37. DWORD decx;
  38. DWORD dedx;
  39. // init cpu in assembly language
  40. void initCpu(DWORD veax)
  41. {
  42. __asm
  43. {
  44. mov eax, veax
  45. cpuid
  46. mov deax, eax
  47. mov debx, ebx
  48. mov decx, ecx
  49. mov dedx, edx
  50. }
  51. }
  52. long getCpuFreq()
  53. {
  54. int start, over;
  55. _asm
  56. {
  57. RDTSC
  58. mov start, eax
  59. }
  60. Sleep(50);
  61. _asm
  62. {
  63. RDTSC
  64. mov over, eax
  65. }
  66. return (over - start) / 50000;
  67. }
  68. std::string getManufactureID()
  69. {
  70. char manuID[25];
  71. memset(manuID, 0, sizeof(manuID));
  72. initCpu(0);
  73. memcpy(manuID + 0, &debx, 4); // copy to array
  74. memcpy(manuID + 4, &dedx, 4);
  75. memcpy(manuID + 8, &decx, 4);
  76. return manuID;
  77. }
  78. std::string getCpuType()
  79. {
  80. const DWORD id = 0x80000002; // start 0x80000002 end to 0x80000004
  81. char cpuType[49];
  82. memset(cpuType, 0, sizeof(cpuType));
  83. for (DWORD t = 0; t < 3; t++)
  84. {
  85. initCpu(id + t);
  86. memcpy(cpuType + 16 * t + 0, &deax, 4);
  87. memcpy(cpuType + 16 * t + 4, &debx, 4);
  88. memcpy(cpuType + 16 * t + 8, &decx, 4);
  89. memcpy(cpuType + 16 * t + 12, &dedx, 4);
  90. }
  91. return cpuType;
  92. }
  93. void getCpuInfo()
  94. {
  95. std::cout << "CPU main frequency: " << getCpuFreq() << "MHz" << std::endl;
  96. std::cout << "CPU manufacture: " << getManufactureID() << std::endl;
  97. std::cout << "CPU type: " << getCpuType() << std::endl;
  98. }
  99. // ---- get memory info ---- //
  100. void getMemoryInfo()
  101. {
  102. std::string memory_info;
  103. MEMORYSTATUSEX statusex;
  104. statusex.dwLength = sizeof(statusex);
  105. if (GlobalMemoryStatusEx(&statusex))
  106. {
  107. unsigned long long total = 0, remain_total = 0, avl = 0, remain_avl = 0;
  108. double decimal_total = 0, decimal_avl = 0;
  109. remain_total = statusex.ullTotalPhys % GBYTES;
  110. total = statusex.ullTotalPhys / GBYTES;
  111. avl = statusex.ullAvailPhys / GBYTES;
  112. remain_avl = statusex.ullAvailPhys % GBYTES;
  113. if (remain_total > 0)
  114. decimal_total = (remain_total / MBYTES) / DKBYTES;
  115. if (remain_avl > 0)
  116. decimal_avl = (remain_avl / MBYTES) / DKBYTES;
  117. decimal_total += (double)total;
  118. decimal_avl += (double)avl;
  119. char  buffer[kMaxInfoBuffer];
  120. sprintf_s(buffer, kMaxInfoBuffer, "total %.2f GB (%.2f GB available)", decimal_total, decimal_avl);
  121. memory_info.append(buffer);
  122. }
  123. std::cout << memory_info << std::endl;
  124. }
  125. int main(int argc, char *argv[])
  126. {
  127. std::cout << "===os information===" << std::endl;
  128. getOsInfo();
  129. std::cout << "===cpu infomation===" << std::endl;
  130. getCpuInfo();
  131. std::cout << "===memory information===" << std::endl;
  132. getMemoryInfo();
  133. system("pause");
  134. return 0;
  135. }

结果:

  1. ===os information===
  2. os name: windows 10
  3. os version: 6.2
  4. ===cpu infomation===
  5. CPU main frequency: 2612MHz
  6. CPU manufacture: GenuineIntel
  7. CPU type:        Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
  8. ===memory information===
  9. total 7.86 GB (1.38 GB available)

Linux
linux下很多信息都是存放着系统的/proc目录下,因此读文件就可以获取到了

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // read the linux config files to get system info
  5. void getOsInfo()
  6. {
  7. FILE *fp = fopen("/proc/version", "r");
  8. if(NULL == fp)
  9. printf("failed to open version\n");
  10. char szTest[1000] = {0};
  11. while(!feof(fp))
  12. {
  13. memset(szTest, 0, sizeof(szTest));
  14. fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
  15. printf("%s", szTest);
  16. }
  17. fclose(fp);
  18. }
  19. void getCpuInfo()
  20. {
  21. FILE *fp = fopen("/proc/cpuinfo", "r");
  22. if(NULL == fp)
  23. printf("failed to open cpuinfo\n");
  24. char szTest[1000] = {0};
  25. // read file line by line
  26. while(!feof(fp))
  27. {
  28. memset(szTest, 0, sizeof(szTest));
  29. fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
  30. printf("%s", szTest);
  31. }
  32. fclose(fp);
  33. }
  34. void getMemoryInfo()
  35. {
  36. FILE *fp = fopen("/proc/meminfo", "r");
  37. if(NULL == fp)
  38. printf("failed to open meminfo\n");
  39. char szTest[1000] = {0};
  40. while(!feof(fp))
  41. {
  42. memset(szTest, 0, sizeof(szTest));
  43. fgets(szTest, sizeof(szTest) - 1, fp);
  44. printf("%s", szTest);
  45. }
  46. fclose(fp);
  47. }
  48. int main(int argc, char **argv)
  49. {
  50. printf("===os information===\n");
  51. getOsInfo();
  52. printf("===cpu infomation===\n");
  53. getCpuInfo();
  54. printf("===memory information===\n");
  55. getMemoryInfo();
  56. return 0;
  57. }

结果:

  1. ===os information===
  2. Linux version 4.8.6-300.fc25.x86_64 (mockbuild@bkernel02.phx2.fedoraproject.org) (gcc version 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC) ) #1 SMP Tue Nov 1 12:36:38 UTC 2016
  3. ===cpu infomation===
  4. processor   : 0
  5. vendor_id   : GenuineIntel
  6. cpu family  : 6
  7. model       : 58
  8. model name  : Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
  9. stepping    : 9
  10. microcode   : 0x1b
  11. cpu MHz     : 2599.755
  12. cache size  : 3072 KB
  13. ===memory information===
  14. MemTotal:        3061552 kB
  15. MemFree:           89584 kB
  16. MemAvailable:     596876 kB
  17. Buffers:           70372 kB
  18. Cached:           707548 kB
  19. SwapCached:          392 kB

PS:硬盘和网络参数也可以通过这种方法拿到,显卡参数可以用制造商提供的驱动API来取得

C/C++获取操作系统、CPU、内存信息(windows和linux)的更多相关文章

  1. C# 获取操作系统相关的信息

    本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: Envir ...

  2. busybox devmem 直接获取、修改内存信息

    /********************************************************************** * busybox devmem 直接获取.修改内存信息 ...

  3. GetSystemInfo 和 GlobalMemoryStatus获取系统信息,内存信息

    // GetSystemInfo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...

  4. C#-获取磁盘,cpu,内存信息

    获取磁盘信息 zongdaxiao = GetHardDiskSpace("C") * 1.0 / 1024; user = GetHardDiskFreeSpace(" ...

  5. linux查看cpu内存信息

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  6. python学习 —— 获取系统运行情况信息并在Linux下设置定时运行python脚本

    代码: # -*- coding:utf-8 -*- from psutil import * def cpu_usage_rate(): for i, j in zip(range(1, cpu_c ...

  7. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  8. java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)

    通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sigar-1.6.4.zip 2.按照主页上的说明解压包后将相应的文件copy到j ...

  9. Java如何获取系统cpu、内存、硬盘信息

    1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu.内存.硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插 ...

随机推荐

  1. erlang 小程序:整数序列,搜索和为正的最长子序列

    近期学习了一下erlang, 编了个小程序 算法例如以下: 把參数分为三个 当前位置的前子序列(Save)(比方 -5, 1,2,-1, _, ... ) 当前位置为_时, 前子序列就是 1,2,-1 ...

  2. QC3.0快充技术详解

    QC3.0 智能手机的电池容量愈来愈大,除了省电能力外,充电速度更成为用户愈来愈重视的特点.高通(Qualcomm)的 Quick Charge 快充技术已成为业界的典范之一,继 Quick Char ...

  3. java基础&amp;&amp;高薪面试

    董鹏老师 ,多年经验总结出 [高薪就业必备]之java基础面试题[更新中]:     第01篇       学习Java基础的目的?       第02天       java语言中有没有gotoke ...

  4. WWDC2014苹果的“软件”发布会

    WWDC 2014 苹果的"软件"发布会 在今年的 6 月 2 日到 6 日,苹果照例举行了一年一次的全球开发者大会(World Wide Developer Conference ...

  5. 九度OJ 1133:学分绩点 (加权平均数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1333 解决:702 题目描述: 北京大学对本科生的成绩施行平均学分绩点制(GPA).既将学生的实际考分根据不同的学科的不同学分按一定的公式 ...

  6. 九度OJ 1122:吃糖果 (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1522 解决:1200 题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N ...

  7. (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。

    原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...

  8. wireshark 学习 1

    wireshark 调试WiFi 安装之后的启动脚步. #!/bin/bash iw dev mon0 del iw dev wlp3s0 interface add mon0 type monito ...

  9. Promise 源码分析

    前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...

  10. wake_lock_timeout的使用方法【转】

    本文转载自:http://blog.csdn.net/liuxd3000/article/details/44224849 今天有用到用ec43_GPIO的中断来唤醒系统,将系统从深度休眠中唤醒并保证 ...