C++ 无法直接跨平台获取 CPU 温度,因无标准库及系统 API 支持;Windows 依赖 WMI 查询 MSAcpi_ThermalZoneTemperature(需 COM 初始化,单位为 0.1K),Linux 遍历 /sys/class/hwmon/ 下 temp*_input 文件(单位为 m°C),跨平台需借助 OpenHardwareMonitor 命令行工具解析 JSON。

C++ 无法直接跨平台获取 CPU 温度 —— 没有标准库支持,也没有 POSIX 或 Windows API 原生提供该功能;所有可行方案都依赖硬件厂商接口或第三方驱动暴露的数据。
Windows 下用 WMI 查询 MSAcpi_ThermalZoneTemperature
这是最接近“免驱动”的方案,但实际受限严重:多数 OEM 厂商未正确实现 ACPI Thermal Zone,返回值常为 0 或无效值(如 27315 表示 0°C,但很多机器根本不填)。
实操建议:
- 必须用
CoInitializeEx初始化 COM,否则SWbemServices::ExecQuery直接失败 - 查询语句写成
"SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature",注意不是Temperature或Value - 返回的
CurrentTemperature单位是十分之一开尔文(K × 10),需先除以 10 再减去 273.15 才得摄氏度 - 在 Dell XPS、Lenovo ThinkPad T 系列上成功率约 30%,Surface 和多数品牌机基本返回
0
Linux 下读取 /sys/class/hwmon/ 中的温度文件
这是目前最可靠的方式,但路径和命名无统一标准,需遍历匹配。
实操建议:
- 遍历
/sys/class/hwmon/hwmon*/下每个目录,检查是否存在name文件且内容含"k10temp"(AMD)、"coretemp"(Intel)或"acpitz"(ACPI 通用) - 找到后读取对应
temp1_input、temp2_input等文件,值为毫摄氏度(如65200= 65.2°C) - 注意权限:普通用户可能无权读取,需加 udev 规则或运行时提示
sudo - 不要硬编码路径(如
/sys/class/hwmon/hwmon2/temp1_input),每次启动设备序号可能变化
跨平台方案只能靠第三方库:OpenHardwareMonitor + C# DLL 封装调用
C++ 原生没有成熟跨平台硬件监控库;OpenHardwareMonitor 是 C# 实现,但可通过 COM 或 .NET Core C++/CLI 桥接调用 —— 实际项目中更常见的是用其命令行工具 OpenHardwareMonitorReport.exe -r json,再由 C++ 解析输出。
实操建议:
- 下载最新版
OpenHardwareMonitor,确保包含OpenHardwareMonitorReport.exe - 用
_popen(Windows)或popen(Linux)执行:OpenHardwareMonitorReport.exe -r json 2>&1,捕获 stdout - JSON 中查找
"Hardware": [{"Identifier":"/intelcpu/0","Sensors":[{"Name":"CPU Package","Value":64.5}]}这类结构 - 注意:首次运行需管理员/root 权限注册传感器驱动,否则返回空数据
真正稳定的方案永远绑定具体硬件:服务器用 IPMI(ipmitool sdr type temperature),嵌入式用 sysfs 或 I²C 寄存器直读。别指望一个 GetCpuTemperature() 函数能通吃所有机器 —— 连主板 BIOS 都不一定把温度值上报给操作系统。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











