c读取cpu温度
时间: 2023-07-28 15:06:52 浏览: 57
要在C语言中读取CPU温度,需要使用操作系统提供的API。不同的操作系统有不同的API,下面以Windows和Linux为例。
Windows:
在Windows下,可以使用WMI(Windows Management Instrumentation)来获取CPU温度信息。具体步骤如下:
1. 引入头文件:
```c
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
```
2. 初始化COM:
```c
CoInitializeEx(NULL, COINIT_MULTITHREADED);
```
3. 连接WMI服务:
```c
IWbemLocator *pLoc = NULL;
IWbemServices *pSvc = NULL;
HRESULT hr;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hr))
{
printf("Failed to create IWbemLocator object. Error code = 0x%x\n", hr);
CoUninitialize();
return 1;
}
hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hr))
{
printf("Could not connect. Error code = 0x%x\n", hr);
pLoc->Release();
CoUninitialize();
return 1;
}
```
4. 设置安全级别:
```c
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if (FAILED(hr))
{
printf("Could not set proxy blanket. Error code = 0x%x\n", hr);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
```
5. 查询WMI:
```c
IEnumWbemClassObject* pEnumerator = NULL;
hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hr))
{
printf("Query for Win32_PerfFormattedData_Counters_ThermalZoneInformation failed. Error code = 0x%x\n", hr);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (uReturn == 0)
{
break;
}
VARIANT vtProp;
hr = pclsObj->Get(L"Temperature", 0, &vtProp, 0, 0);
if (FAILED(hr))
{
printf("Failed to get temperature property. Error code = 0x%x\n", hr);
pclsObj->Release();
continue;
}
printf("CPU Temperature: %d\n", vtProp.intVal);
VariantClear(&vtProp);
pclsObj->Release();
}
pEnumerator->Release();
```
6. 释放COM资源:
```c
pSvc->Release();
pLoc->Release();
CoUninitialize();
```
Linux:
在Linux下,可以通过读取/sys/class/thermal/thermal_zoneX/temp文件来获取CPU温度信息。其中X是温度传感器的ID,一般为0。具体代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
float get_cpu_temperature()
{
char path[MAX_SIZE];
char line[MAX_SIZE];
FILE *fp;
float temp = -1.0;
sprintf(path, "/sys/class/thermal/thermal_zone%d/temp", 0);
fp = fopen(path, "r");
if (fp == NULL)
{
printf("Failed to open temperature file\n");
return temp;
}
fgets(line, MAX_SIZE, fp);
temp = atoi(line) / 1000.0;
fclose(fp);
return temp;
}
int main()
{
float temp = get_cpu_temperature();
if (temp < 0)
{
printf("Failed to get CPU temperature\n");
}
else
{
printf("CPU Temperature: %.2f\n", temp);
}
return 0;
}
```