2014-05-17 14 views
5

Ci sono molte domande simili a questa, ma non ho trovato la soluzione lì.ottiene la temperatura della CPU su linux ubuntu 12.10 con AMD FX 4100 Quad Core

Come posso ottenere la temperatura della CPU in C o C++ su Linux Ubuntu 12.10 senza chiamare allosensors? Naturalmente posso solo leggerlo dal file, tuttavia non riesco a trovare dove è memorizzato in 12.10. E la semplice lettura di un file di testo è solo una possibilità o forse posso interrogare il kernel usando la chiamata di sistema o il segnale?

contenuto del mio cartella/proc/acpi/è solo

event wakeup 

No THEMP0 lì o qualcosa di simile. L'applicazione sensors tuttavia può visualizzare una temperatura sulla mia macchina.

senza /sys/class/thermal/thermal_zone0/ directory

in /sys/class/thermal devo

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

Sto cercando di passare in rassegna lm-sensors codice sorgente alla ricerca di come si recupera la temperatura, senza alcun risultato fino ad ora, ma sono vicino. Il file è

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

in particolare:

linea 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' per vedere quale' sensore' si apre, potrebbe darvi un indizio. – nos

risposta

3

Secondo la sysfs documentation, le informazioni dei sensori viene immagazzinato sotto /sys/class/hwmon con directory diversa per ogni chip. Che è coerente con le uscite che vedo su Ubuntu 13.10.

I file utilizzati da sensori sono:

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

A seconda dei chip numero dispositivi/virtuali, ci possono essere molte hwmon directory.

uscita sul mio sistema dual core:

$ 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 

Dove hwmon1 è quella per il mio 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 

I valori temp2* e temp3* corrispondono rispettivamente core 0 e core 1. Fondamentalmente questi sono i file da leggere sensors da. A seconda dei dispositivi hardware in uso, la directory della CPU (hwmon1 nel mio caso) con le informazioni sulla temperatura potrebbe essere diversa.

+0

grazie,/sys/class/hwmon/hwmon2/device/temp1_input è quello che stavo cercando – 4pie0

1

sulla base di lm-sensors e risposta di Blue Moon Ho scritto questo codice che funziona bene su Ubuntu 12.10 con AMD FX processore 4100 Quad Core:

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; 
} 

Un codice (questo è solo esempio) può essere trovato here e here è uno strumento di registrazione.

+0

'/ sys/class/hwmon/hwmonX/device/name' può essere usato per verificare se è l'hardware che ti interessa (' coretemp' for CPU) per rendere più portabile come dir della CPU ('hwmon2') potrebbe non essere lo stesso su tutte le macchine anche usando lo stesso OS. –

Problemi correlati