2014-05-17 10 views
5

Jest wiele pytań podobnych do tego, ale nie znalazłem tam rozwiązania.uzyskać temperaturę procesora na Ubuntu 12.10 z AMD FX 4100 Quad Core

Jak mogę uzyskać temperaturę procesora w C lub C++ na Linux Ubuntu 12.10 bez połączenia zsensors? Mogę oczywiście po prostu odczytać go z pliku, ale nie mogę znaleźć, gdzie jest on zapisany w 12.10. Czy proste jest czytanie tylko pliku tekstowego, czy może mogę zapytać o jądro za pomocą wywołania systemowego lub sygnału?

zawartość mojego katalogu/proc/acpi/jest tylko

event wakeup 

Nie THEMP0 tam albo coś takiego. Aplikacja sensors może wyświetlać temperaturę na moim komputerze.

nie /sys/class/thermal/thermal_zone0/ katalog

w /sys/class/thermal mam

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

próbuję przeglądać lm-sensors kodu źródłowego w poszukiwaniu jak ona pobiera temperaturę, bezskutecznie do tej pory, jednak jestem blisko. Plik jest

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

w szczególności:

Linia 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', aby zobaczyć, co' sensors' otwiera, może dać ci wskazówkę. – nos

Odpowiedz

3

Według sysfs documentation informacje czujniki są przechowywane pod /sys/class/hwmon z innego katalogu dla każdego chipa. Co jest zgodne z wynikami, które widzę na moim Ubuntu 13.10.

Pliki używane przez czujniki są:

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

zależności od chipsów/numer urządzeń wirtualnych, nie może być wiele hwmon katalogów.

Wyjście na moim systemie dualnym rdzenia:

$ 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 

Gdzie hwmon1 jest dla moich procesorów:

$ 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 

Wartości z temp2* i temp3* odpowiadają core 0 i core 1 odpowiednio. Zasadniczo są to pliki sensors odczytujące dane z. W zależności od posiadanego sprzętu, katalog procesora (hwmon1 w moim przypadku) z informacjami o temperaturze może być różny.

+0

dziękuję,/sys/class/hwmon/hwmon2/device/temp1_input jest tym, czego szukałem. – 4pie0

1

podstawie lm czujników i odpowiedzi Blue Moon Pisałem ten kod, który działa dobrze na Ubuntu 12.10 z AMD FX procesor 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; 
} 

kod (to tylko przykład) można Znaleziono here i here to narzędzie do rejestrowania.

+0

'/ sys/class/hwmon/hwmonX/device/name' może być użyty do sprawdzenia, czy to sprzęt, którym jesteś zainteresowany (' coretemp' for CPU), aby uczynić bardziej przenośnym, ponieważ katalog CPU ('hwmon2') może nie być taki sam na wszystkich komputerach, nawet przy użyciu tego samego systemu operacyjnego. –

Powiązane problemy