2014-05-17 101 views
5

有很多类似的问题,但我还没有找到解决方案。在linux ubuntu 12.10上使用AMD FX 4100四核处理器获得CPU温度

如何在Linux或Linux上使用C或C++获得CPU温度Ubuntu Ubuntu 12.10 未调用sensors?我当然可以从文件中读取它,但是我无法在12.10中找到它的存储位置。只是简单地阅读文本文件的可能性,或者我可以使用系统调用或信号查询内核?我的文件夹中的/ proc/ACPI的

内容/只是

event wakeup 

没有THEMP0或有这样的事。然而,sensors应用程序可以在我的机器上显示温度。

没有/sys/class/thermal/thermal_zone0/目录

/sys/class/thermal

[email protected] [email protected] [email protected] [email protected] 

我想浏览搜索lm-sensors源代码,它是如何获取温度,都无济于事到目前为止,但我靠近。该文件是

http://lm-sensors.org/browser/lm-sensors/trunk/lib/sysfs.c

特别

线846:

846 int sensors_read_sysfs_attr(const sensors_chip_name *name, 
847        const sensors_subfeature *subfeature, 
848        double *value) 
+0

'strace -f/usr/bin/sensors 2>&1 | grep open'来查看'sensors'打开了什么,可能会给你一个线索。 – nos

回答

3

根据该sysfs documentation,传感器信息被存储/sys/class/hwmon下具有不同的目录的每个芯片。这与我在Ubuntu 13.10上看到的输出一致。

由传感器所使用的文件是:

/sys/class/hwmon/hwmon*/device/temp* 

根据数芯片/虚拟设备上,可以有很多hwmon目录。

输出我的双核系统中:

$ pwd 
/sys/class/hwmon 
$ ls -l 
total 0 
lrwxrwxrwx 1 root root 0 May 17 14:29 hwmon0 -> ../../devices/virtual/hwmon/hwmon0 
lrwxrwxrwx 1 root root 0 May 17 14:29 hwmon1 -> ../../devices/platform/coretemp.0/hwmon/hwmon1 
lrwxrwxrwx 1 root root 0 May 17 14:29 hwmon2 -> ../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/hwmon/hwmon2 

hwmon1是一个针对我的CPU:

$ pwd 
/sys/class/hwmon/hwmon1/device 
$ ls -l 
total 0 
lrwxrwxrwx 1 root root 0 May 17 14:29 driver -> ../../../bus/platform/drivers/coretemp 
drwxr-xr-x 3 root root 0 May 17 14:29 hwmon 
-r--r--r-- 1 root root 4096 May 17 23:21 modalias 
-r--r--r-- 1 root root 4096 May 17 14:29 name 
drwxr-xr-x 2 root root 0 May 17 23:21 power 
lrwxrwxrwx 1 root root 0 May 17 14:29 subsystem -> ../../../bus/platform 
-r--r--r-- 1 root root 4096 May 17 14:29 temp2_crit 
-r--r--r-- 1 root root 4096 May 17 14:29 temp2_crit_alarm 
-r--r--r-- 1 root root 4096 May 17 14:29 temp2_input 
-r--r--r-- 1 root root 4096 May 17 23:11 temp2_label 
-r--r--r-- 1 root root 4096 May 17 14:29 temp2_max 
-r--r--r-- 1 root root 4096 May 17 14:29 temp3_crit 
-r--r--r-- 1 root root 4096 May 17 14:29 temp3_crit_alarm 
-r--r--r-- 1 root root 4096 May 17 14:29 temp3_input 
-r--r--r-- 1 root root 4096 May 17 23:11 temp3_label 
-r--r--r-- 1 root root 4096 May 17 14:29 temp3_max 
-rw-r--r-- 1 root root 4096 May 17 14:29 uevent 

temp2*从这些值和temp3*分别对应于core 0core 1。基本上这些是从sensors读取数据的文件。根据你的硬件设备,你的CPU目录(在我的情况下为hwmon1)与温度信息可能会有所不同。

+0

感谢,/ sys/class/hwmon/hwmon2/device/temp1_input是我在寻找的 – 4pie0

1

基于LM-传感器和蓝月亮的答案我写了这个代码,在Ubuntu 12.10正常工作与AMD FX 4100四核处理器:

int main(void) { 

    double value; 
    int TEMP_IDX_MAX = 3; 
    FILE *f; 
    const char* n[] = {"/sys/class/hwmon/hwmon0/device/temp1_input", 
         "/sys/class/hwmon/hwmon0/device/temp2_input", 
         "/sys/class/hwmon/hwmon0/device/temp3_input"}; 

    for (int i = 0; i < TEMP_IDX_MAX; ++i) { 
     if ((f = fopen(n[i], "r"))) { 

      int res, err = 0; 
      errno = 0; 
      res = fscanf(f, "%lf", &value); 
      if (res == EOF && errno == EIO) 
       err = -SENSORS_ERR_IO; 
      else if (res != 1) 
       err = -SENSORS_ERR_ACCESS_R; 
      res = fclose(f); 
      if (err) 
       return err; 

      if (res == EOF) { 
       if (errno == EIO) 
        return -SENSORS_ERR_IO; 
       else 
        return -SENSORS_ERR_ACCESS_R; 
      } 
      value /= get_type_scaling(SENSORS_SUBFEATURE_TEMP_INPUT); 
     } else 
      return -SENSORS_ERR_KERNEL; 

     printf("%lf\n", value); 
    } 

    return 0; 
} 

A码(这只是举例)发现herehere是一个日志记录工具。

+0

'/ sys/class/hwmon/hwmonX/device/name'可以用来检查它是否是你感兴趣的硬件(' coretemp'用于CPU),因为即使使用相同的OS,所有机器上的CPU目录('hwmon2')可能都不相同。 –