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插 ...
随机推荐
- vue2.0 + vux 项目搭建
1.快速搭建项目模板 因为项目使用vux,所以推荐使用vux官网的airyland/vux2 模板,vue-cli工具是vue项目的搭建脚手架 默认为 webpack2 模板,如果你需要使用webpa ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型 ...
- qt-mingw530-opencv-开发配置
1.安装好Qt和Qtcreator 2.解压OpenCV源码到一个目录下.路径不能带空格和中文. 3.把E:\Qt\qtcreator-2.1.0\mingw\bin添加到系统环境变量中. 4.安装C ...
- 在Fedora24/25中轻松安装gcc 4.9
在Fedora24/25中轻松安装gcc 4.9 http://blog.csdn.net/u010158659/article/details/53608285 标签: gccgcc-4.9Fedo ...
- 模式识别之不变矩---SIFT和SURF的比较
- Oracle学习(十三):闪回
1.知识点:能够对比以下的录屏进行阅读 SQL> --1. 错误地删除了记录 SQL> --2. 错误地删除了表 SQL> --3. 查询历史记录 SQL> --4. 怎样撤销 ...
- babylon使用3dsmax导出的obj文件时模型偏暗
将模型的material的diffuseTexture设置为null即可
- c# 怎么获取自己的IP地址
1.aspx页面,asp.net项目的页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehin ...
- Javascript学习之Date对象详解
1.定义 创建 Date 实例用来处理日期和时间.Date 对象基于1970年1月1日世界协调时起的毫秒数 2.语法 构造函数 new Date() new Date(value) value代表自世 ...
- Decorator Pattern
1.Decorator 模式通过组合的方式提供了一种给类增加职责(操作)的方法. 2.Decorator模式结构图 3.实现 #ifndef _DECORATOR_H_ #define _DECORA ...