2014-05-17 18 views
5

Es gibt viele Fragen ähnlich, aber ich habe keine Lösung gefunden.bekommen CPU-Temperatur auf Linux Ubuntu 12.10 mit AMD FX 4100 Quad Core

Wie bekomme ich CPU-Temperatur in C oder C++ auf Linux Ubuntu 12.10 ohne Anruf ansensors? Ich kann natürlich nur aus der Datei lesen, aber ich kann nicht finden, wo es in 12.10 gespeichert ist. Und ist das einfache Lesen einer Textdatei nur möglich oder kann ich den Kernel mit Systemaufruf oder Signal abfragen?

Inhalt meiner Ordner/proc/acpi/ist nur

event wakeup 

Kein THEMP0 dort oder etwas Ähnliches. sensors Anwendung kann jedoch eine Temperatur auf meiner Maschine anzeigen.

keine /sys/class/thermal/thermal_zone0/ Verzeichnis

in /sys/class/thermal Ich habe

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

Ich versuche, für lm-sensors Quellcode auf der Suche zu durchsuchen, wie es ruft Temperatur, ohne Erfolg so weit, aber nahe dran Ich bin. Die Datei ist

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

insbesondere

Linie 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/sensoren 2> & 1 | grep open', um zu sehen, was' sensors' sich öffnet, könnte Ihnen einen Anhaltspunkt geben. – nos

Antwort

3

Gemäß den sysfs documentation werden die Sensor Informationen unter /sys/class/hwmon mit unterschiedlichem Verzeichnis für jeden Chip gespeichert. Das stimmt mit den Ausgaben überein, die ich auf meinem Ubuntu 13.10 sehe.

Die Dateien, die von Sensoren verwendet werden, sind:

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

Je nach Anzahl Chips/virtuelle Geräte können dort hwmon Verzeichnisse viele sein.

Output auf meinem Dual-Core-System:

$ 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 Wo die eine für meine CPUs ist:

$ 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 

Die Werte aus temp2* und temp3* entsprechen core 0 und core 1 sind. Grundsätzlich sind dies die Dateien sensors lesen Daten von. Abhängig von Ihren Hardwaregeräten, die Sie haben, kann Ihr CPU-Verzeichnis (hwmon1 in meinem Fall) mit Temperaturinformationen unterschiedlich sein.

+0

danke,/sys/class/hwmon/hwmon2/device/temp1_input ist was ich gesucht habe – 4pie0

1

Basierend auf lm-sensor und Antwort von Blue Moon habe ich diesen Code geschrieben, der auf Ubuntu 12.10 mit AMD FX 4100 Quad-Core-Prozessor funktioniert gut: seine

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-Code (das ist nur Beispiel) kann gefunden here und here ist ein Protokollierungswerkzeug.

+0

'/ sys/class/hwmon/hwmonX/device/name' kann verwendet werden, um zu überprüfen, ob es Hardware ist, die Sie interessiert sind (' "CoreTemp" für CPU), um portabler zu machen, da das CPU-Verzeichnis ('hwmon2') möglicherweise nicht auf allen Maschinen gleich ist, selbst wenn dasselbe Betriebssystem verwendet wird. –