Kapitel 4 Zugriff auf Systeminformationen
Das /proc-(Pseudo-)Filesystem beinhaltet eine Menge Informationen zu Ihrem System. Ob Sie nun Informationen zum aktuellen Prozess, zur Hardware in Ihrem System oder zum Kernel benötigen, all dies finden Sie im /proc-Filesystem.
Da der Kernel den kompletten Rechner verwaltet, besitzt dieser auch eine Menge Informationen zum System, auf dem dieser läuft. Diese Informationen werden vom Kernel in Pseudo-Dateien und Pseudo-Verzeichnissen angelegt. All diese Dateien liegen im /proc-Verzeichnis. Auf die Einträge im /proc-Verzeichnis können Sie wie auf gewöhnliche Dateien zugreifen; meistens allerdings nur lesend. Dieses (Pseudo-)Dateisystem belegt keinerlei Plattenplatz und befindet sich im Hauptspeicher (RAM). Sie können sich gerne einen Überblick zum /proc-Verzeichnis verschaffen.
$ ls -l /proc | less
Auf alle diese Informationen können Sie (fast) ohne weiteres lesend zugreifen. Wollen Sie z. B. den aktuellen Kernel Ihres Systems ermitteln und ausgeben lassen, können Sie auf die Datei /proc/version zugreifen:
$ cat /proc/version
Linux version 2.4.20–4GB (root@Pentium.suse.de)
(gcc version 3.3 20030226 (prerelease) (SUSE Linux))
#1 Mon Mar 17 17:54:44 UTC 2003
Oder auf dem System des Fachgutachters:
$ cat /proc/version
Linux version 2.6.4-HX (hirogen2@io.hopto.org)
(gcc version 3.3.3 (SUSE Linux))
#14 Mon May 31 12:13:37 CEST 2004
Schon erhalten Sie die aktuelle Kernel-Version, das Datum, an dem dieser kompiliert wurde, und die Version des zugehörigen Compilers als String zurück.
Hinweis Die hier vorgestellten Beispiele wurden auf einem Linux-System mit den Kernel-Versionen 2.4 (Version des Autors) und 2.6 (Version des Fachgutachters) getestet – wobei es hier und da einige Unterschiede gibt. Das in 2.5 eingeführte /sys, das langfristig große Teile von /proc ersetzen soll, enthält aber noch nichts Nennenswertes, weshalb darauf nicht weiter eingegangen wird.
|
4.1 Informationen aus dem /proc-Verzeichnis herausziehen
Als Programmierer dürfte Sie in erster Linie interessieren, wie Sie mit Ihrem Programm an diese Informationen kommen. Als Beispiel dient hier die Speicherauslastung des Systems. Hierbei soll lediglich ermittelt werden, wie viel RAM insgesamt auf Ihrem System zur Verfügung steht. Diese Informationen erhalten Sie aus /proc/meminfo:
$ cat /proc/meminfo
total: used: free: shared: buffers: cached:
261906432 255688704 6217728 0 26406912 128688128
Swap: 526376960 978944 525398016
MemTotal: 255768 kB
MemFree: 6072 kB
MemShared: 0 kB
Buffers: 25788 kB
Cached: 124724 kB
SwapCached: 948 kB
Active: 76372 kB
Inactive: 140592 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 255768 kB
LowFree: 6072 kB
SwapTotal: 514040 kB
SwapFree: 513084 kB
BigFree: 0 kB
Hinweis meminfo aus Kernel 2.6 sieht etwas anders aus. Die ersten drei Zeilen fehlen, können aber durch »free -b« kompensiert werden.
|
Uns interessiert hier der Wert »MemTotal«. Der einfachste Weg, diesen Wert auszulesen, ist es, /proc/meminfo mit fopen() zu öffnen, in einen Puffer einzulesen und nach der Stringfolge »MemTotal« zu suchen. Anschließend kann der Wert mit der sscanf() aus dem Puffer in eine dafür vorgesehene Variable übergeben werden. Hier das mögliche Beispiel:
/* memory.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
static long get_mem_total (void) {
FILE *fp;
char buffer[1024];
size_t bytes_read;
char *match;
long mem_tot;
if((fp = fopen("/proc/meminfo", "r")) == NULL) {
perror("fopen()");
exit(EXIT_FAILURE);
}
bytes_read = fread (buffer, 1, sizeof (buffer), fp);
fclose (fp);
if (bytes_read == 0 || bytes_read == sizeof (buffer))
return 0;
buffer[bytes_read] = '\0';
/* Suchen nach der Stringfolge "Memtotal" */
match = strstr (buffer, "MemTotal");
if (match == NULL) /* Nicht gefunden */
return 0;
sscanf (match, "MemTotal: %ld", &mem_tot);
return (mem_tot/1024); /* 1MB = 1024KB */
}
int main (void) {
long memory = get_mem_total();
if(memory == 0)
printf("Konnte RAM nicht ermitteln\n");
else
printf("Vorhandener Arbeitsspeicher: %ldMB\n" ,memory);
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc -o memory memory.c
$ ./memory
Vorhandener Arbeitsspeicher: 249MB
So oder so ähnlich können Sie in der Regel bei allen Informationen vorgehen, die Sie im /proc-Verzeichnis finden und benötigen. Sie sollten allerdings darauf achten, dass sich der Name des Eintrags im /proc-Verzeichnis bei neueren Kernel-Versionen ändern könnte. So könnte vielleicht in absehbarer Zeit aus /proc/meminfo /proc/more_meminfo (nur ein Beispiel) werden. Bedenken Sie dies, wenn Sie Ihr Programm auf dem Stand der Zeit halten wollen.
|