有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,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. HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. Android 音频的播放之二MediaPlayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...

  3. python(22)- 递归和函数式编程

    递归: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 1. 必须有一个明确的结束条件: 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少: 3.递 ...

  4. liunx安装redis和gcc

    首先去上下载redis,我现在用的版本是:redis-3.0.4.tar.gz 然后放到虚拟机里面解压,下面是三种解压命令: tar -zxvf file.tar.gz tar -jcvf file ...

  5. iphone手机连接USB时出现须要Mobile device setup disk上的usbaapl.sys文件

    问题: iphone5 手机连接USB出现例如以下弹框 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5nZWwyMnh1/font/5a6L5L2T/ ...

  6. angular ui $modal 使用 option

    $modal是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们 $modal仅有一个方法open(options) templateUrl:模态窗口的地址 template:用于显示ht ...

  7. 调用Camera返回为空的分析及处理方法

    前言 大家可能遇到了这种情况.调用Camera,然后指定自己定义的保存路径,结果返回的Intent为空.我们来分析一下原因. 分析 首先看Camera的部分逻辑,在源代码中的Camera.java的d ...

  8. 简述C++中的多态机制

    前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...

  9. 利用crtmpserver搭建rtmp服务器

    Google + 实践:最终直播成功. 记录一下. 这样.兴许就能够对代码进行改造,利用开源码实现:Android平台下.搭建rtmpserver.浏览器端利用flash播放视频. 代码架构为:ffm ...

  10. TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)

    -------------------- TWinControl收到WM_Paint消息(以后找个例子)-------------------- 1. 消息函数 TWinControl.WMPaint ...