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插 ...
随机推荐
- NYOJ 722 数独 【DFS】+【预处理】
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家须要依据9×9盘面上的已知数字,推理出全部剩余空格的数字,并满足每一 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- POJ1830开关问题——gauss消元
题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...
- kubernetes滚动更新
系列目录 简介 当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务.如果业务集群规模较大时,这个工作就变成了一个挑 ...
- 模式匹配之常见匹配算法---SIFT/SURF、haar特征、广义hough变换的特性对比分析
识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...
- LeetCode(88)题解-- Merge Sorted Array
https://leetcode.com/problems/merge-sorted-array/ 题目: Given two sorted integer arrays nums1 and nums ...
- duplicate symbols for architeture arm64 linker command failed with code 1(use-c to see invocation)
duplicate symbols for architeture arm64 linker command failed with code 1(use-c to see invocation) ...
- Python 008- 游戏2048
#-*- coding:utf-8 -*- import curses from random import randrange, choice # generate and place new ti ...
- EasyPusher/EasyDarwin/EasyPlayer实现手机直播版本及效果整理
EasyPusher手机直播 实现功能 最近很多EasyDarwin爱好者提出了手机移动端直播的功能需求,尤其是如何做出像映客这样能够快速出画面播放的效果,经过一段时间的移动端和服务端的优化,Easy ...
- 【智能无线小车系列九】在树莓派上使用USB摄像头
材料准备: 1.树莓派 2.AS 4WD小车 3.WebCam 4.小米移动电源 5.TP—LINK 高增益150MUSB无线网卡 操作流程: 1.将WebCam插上树莓派后,首先要确认树莓派是否支持 ...