C/C++获取操作系统、CPU、内存信息(windows和linux)
有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,cpu,内存,显卡,硬盘等,作为后续软件功能判断的依据,甚至参与性能算法自适应建模
Windows
操作系统和内存信息在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;
- }
结果:
- ===os information===
- os name: windows 10
- os version: 6.2
- ===cpu infomation===
- CPU main frequency: 2612MHz
- CPU manufacture: GenuineIntel
- CPU type: Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
- ===memory information===
- total 7.86 GB (1.38 GB available)
Linux
linux下很多信息都是存放着系统的/proc目录下,因此读文件就可以获取到了
代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- // read the linux config files to get system info
- void getOsInfo()
- {
- FILE *fp = fopen("/proc/version", "r");
- if(NULL == fp)
- printf("failed to open version\n");
- char szTest[1000] = {0};
- while(!feof(fp))
- {
- memset(szTest, 0, sizeof(szTest));
- fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
- printf("%s", szTest);
- }
- fclose(fp);
- }
- void getCpuInfo()
- {
- FILE *fp = fopen("/proc/cpuinfo", "r");
- if(NULL == fp)
- printf("failed to open cpuinfo\n");
- char szTest[1000] = {0};
- // read file line by line
- while(!feof(fp))
- {
- memset(szTest, 0, sizeof(szTest));
- fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
- printf("%s", szTest);
- }
- fclose(fp);
- }
- void getMemoryInfo()
- {
- FILE *fp = fopen("/proc/meminfo", "r");
- if(NULL == fp)
- printf("failed to open meminfo\n");
- char szTest[1000] = {0};
- while(!feof(fp))
- {
- memset(szTest, 0, sizeof(szTest));
- fgets(szTest, sizeof(szTest) - 1, fp);
- printf("%s", szTest);
- }
- fclose(fp);
- }
- int main(int argc, char **argv)
- {
- printf("===os information===\n");
- getOsInfo();
- printf("===cpu infomation===\n");
- getCpuInfo();
- printf("===memory information===\n");
- getMemoryInfo();
- return 0;
- }
结果:
- ===os information===
- 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
- ===cpu infomation===
- processor : 0
- vendor_id : GenuineIntel
- cpu family : 6
- model : 58
- model name : Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
- stepping : 9
- microcode : 0x1b
- cpu MHz : 2599.755
- cache size : 3072 KB
- ===memory information===
- MemTotal: 3061552 kB
- MemFree: 89584 kB
- MemAvailable: 596876 kB
- Buffers: 70372 kB
- Cached: 707548 kB
- SwapCached: 392 kB
PS:硬盘和网络参数也可以通过这种方法拿到,显卡参数可以用制造商提供的驱动API来取得
C/C++获取操作系统、CPU、内存信息(windows和linux)的更多相关文章
- C# 获取操作系统相关的信息
本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: Envir ...
- busybox devmem 直接获取、修改内存信息
/********************************************************************** * busybox devmem 直接获取.修改内存信息 ...
- GetSystemInfo 和 GlobalMemoryStatus获取系统信息,内存信息
// GetSystemInfo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...
- C#-获取磁盘,cpu,内存信息
获取磁盘信息 zongdaxiao = GetHardDiskSpace("C") * 1.0 / 1024; user = GetHardDiskFreeSpace(" ...
- linux查看cpu内存信息
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...
- python学习 —— 获取系统运行情况信息并在Linux下设置定时运行python脚本
代码: # -*- coding:utf-8 -*- from psutil import * def cpu_usage_rate(): for i, j in zip(range(1, cpu_c ...
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...
- java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)
通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sigar-1.6.4.zip 2.按照主页上的说明解压包后将相应的文件copy到j ...
- Java如何获取系统cpu、内存、硬盘信息
1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu.内存.硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插 ...
随机推荐
- HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Android 音频的播放之二MediaPlayer
MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...
- python(22)- 递归和函数式编程
递归: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 1. 必须有一个明确的结束条件: 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少: 3.递 ...
- liunx安装redis和gcc
首先去上下载redis,我现在用的版本是:redis-3.0.4.tar.gz 然后放到虚拟机里面解压,下面是三种解压命令: tar -zxvf file.tar.gz tar -jcvf file ...
- iphone手机连接USB时出现须要Mobile device setup disk上的usbaapl.sys文件
问题: iphone5 手机连接USB出现例如以下弹框 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5nZWwyMnh1/font/5a6L5L2T/ ...
- angular ui $modal 使用 option
$modal是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们 $modal仅有一个方法open(options) templateUrl:模态窗口的地址 template:用于显示ht ...
- 调用Camera返回为空的分析及处理方法
前言 大家可能遇到了这种情况.调用Camera,然后指定自己定义的保存路径,结果返回的Intent为空.我们来分析一下原因. 分析 首先看Camera的部分逻辑,在源代码中的Camera.java的d ...
- 简述C++中的多态机制
前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...
- 利用crtmpserver搭建rtmp服务器
Google + 实践:最终直播成功. 记录一下. 这样.兴许就能够对代码进行改造,利用开源码实现:Android平台下.搭建rtmpserver.浏览器端利用flash播放视频. 代码架构为:ffm ...
- TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)
-------------------- TWinControl收到WM_Paint消息(以后找个例子)-------------------- 1. 消息函数 TWinControl.WMPaint ...