有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,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. weblogic中部署项目报错org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken .

    原因: 原因是weblogic要查找自己的antlr,和lib下面的antlr包冲突.... 解决方法: 在weblogic.xml添加 <container-descriptor>    ...

  2. 关于 AlphaGo 论文的阅读笔记

    这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...

  3. Ffmpeg 获取USB Camera 视频流

    本文讲述的案例是如何通过Ffmpeg实现从USB Camera中获取视频流并将视频流保存到MP4文件. 本文亦适用于从USB Camera 获取视频流并将视频流转发到rtmp服务的案例,二者基本的原理 ...

  4. git 忽略文件的三种方式

    1. 在项目目录下新建.gitignore文件并添加规则 特点:此种方式的忽略规则只局限于本项目目录及其子目录,并且.gitignore文件会被提交到远程仓库进行共享忽略规则. 2. 在.git/in ...

  5. 我的vim插件列表

    一.正在使用的插件 1. NERD tree   文件浏览 2. bufexplorer  buffer 浏览 3. mru.vim   最近使用的文件浏览 4. ctrlp.vim  文件模糊搜索, ...

  6. 【网络协议】TCP的流量控制机制

    一般来说,我们总是希望传输数据的更快一些,但假设发送方把数据发送的非常快.而接收方来不及接收,这就可能造成数据的丢失.流量控制就是让发送方的发送速率不要太快.让接收方来得及接收. 对于成块数据流,TC ...

  7. Deployment相对ReplicaSet优势

    系列目录 RS与Deployment主要用于替代RC.RS的全称为Replica Set.相对于RC,RS与Deployment的优势如下: RC只支持基于等式的selector,如env=dev或者 ...

  8. Oracle中如何进行进制转换(2进制,10进制,16进制)

    1.16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XX ...

  9. EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器

    在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时,我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 和 Ea ...

  10. 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...