如何用C语言直接获取Linux下NVIDIA GPU的整数形式温度?
当然可以!你完全不用依赖解析nvidia-settings的输出来获取GPU温度——这种解析字符串的方式确实在持续监测时会有不必要的性能开销。下面给你两种高效的方案,直接拿到整数形式的GPU温度值:
方案一:使用NVIDIA官方NVML库(推荐)
NVML(NVIDIA Management Library)是NVIDIA提供的官方管理库,专门用于监控和管理NVIDIA GPU,功能全面且兼容性强,是长期监测GPU状态的首选方案。
步骤:
安装NVML开发包:
在Debian/Ubuntu系统上,可以通过以下命令安装:sudo apt-get install libnvidia-ml-dev其他发行版可以查找对应的包(比如RHEL/CentOS的
nvidia-ml-devel)。C语言代码示例:
这段代码会初始化NVML,获取第一个GPU的核心温度,然后输出整数形式的摄氏度数值:#include <stdio.h> #include <nvidia-ml.h> int main() { nvmlReturn_t result; nvmlDevice_t device; unsigned int temp; // 初始化NVML库 result = nvmlInit(); if (result != NVML_SUCCESS) { printf("NVML初始化失败:%s\n", nvmlErrorString(result)); return 1; } // 获取第一个GPU设备(索引0) result = nvmlDeviceGetHandleByIndex(0, &device); if (result != NVML_SUCCESS) { printf("获取GPU设备失败:%s\n", nvmlErrorString(result)); nvmlShutdown(); return 1; } // 获取GPU核心温度(单位:摄氏度,整数) result = nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temp); if (result != NVML_SUCCESS) { printf("获取温度失败:%s\n", nvmlErrorString(result)); nvmlShutdown(); return 1; } printf("GPU核心温度:%u°C\n", temp); // 清理NVML资源 nvmlShutdown(); return 0; }编译运行:
编译时需要链接NVML库:gcc -o gpu_temp gpu_temp.c -lnvidia-ml ./gpu_temp
方案二:读取sysfs系统文件(轻量无依赖)
如果你的系统支持sysfs(几乎所有现代Linux发行版都支持),可以直接读取GPU暴露的温度文件,无需依赖任何额外库,非常轻量。
步骤:
找到温度文件路径:
NVIDIA GPU的温度通常会暴露在/sys/class/drm/card0/device/hwmon/目录下的某个temp1_input文件中(card0对应第一个GPU,多GPU场景可以换card1、card2等)。你可以用以下命令快速定位:find /sys/class/drm/card0/device/hwmon -name "temp1_input"输出类似:
/sys/class/drm/card0/device/hwmon/hwmon2/temp1_inputC语言代码示例:
这段代码直接读取该文件的内容,转换为整数后除以1000得到摄氏度(因为文件中存储的是毫摄氏度):#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char buffer[10]; long temp_millic; int temp_c; // 替换为你找到的实际路径 fp = fopen("/sys/class/drm/card0/device/hwmon/hwmon2/temp1_input", "r"); if (fp == NULL) { perror("打开温度文件失败"); return 1; } // 读取文件内容 if (fgets(buffer, sizeof(buffer), fp) == NULL) { perror("读取温度失败"); fclose(fp); return 1; } // 转换为整数(毫摄氏度),再转为摄氏度 temp_millic = strtol(buffer, NULL, 10); temp_c = temp_millic / 1000; printf("GPU核心温度:%d°C\n", temp_c); fclose(fp); return 0; }编译运行:
直接编译即可,无需链接额外库:gcc -o gpu_temp_sysfs gpu_temp_sysfs.c ./gpu_temp_sysfs
方案对比
- NVML库:功能全面(除了温度还能获取显存使用率、功耗等),兼容性强(适配不同NVIDIA驱动版本),适合需要完整GPU监控的场景。
- sysfs读取:轻量无依赖,代码简单,适合只需要温度监测的简单场景,但路径可能因系统、GPU布局或驱动版本略有变化,需要提前确认路径。
两种方案都能直接获取整数形式的温度,完全避免了解析nvidia-settings输出的开销,非常适合持续监测GPU温度的场景。
内容的提问来源于stack exchange,提问作者secdet

