Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 4 Zugriff auf Systeminformationen
  gp 4.1 Informationen aus dem /proc-Verzeichnis herausziehen
  gp 4.2 Hardware-/Systeminformationen ermitteln
    gp 4.2.1 CPU-Informationen – /proc/cpuinfo
    gp 4.2.2 Geräteinformationen – /proc/devices
    gp 4.2.3 PCI-Bus – /proc/pci (nicht 2.6)
    gp 4.2.4 Speicherauslastung – /proc/meminfo
    gp 4.2.5 Weitere Hardware-Informationen zusammengefasst
  gp 4.3 Prozessinformationen
    gp 4.3.1 /proc/$pid/cmdline
    gp 4.3.2 /proc/$pid/environ
    gp 4.3.3 /proc/self
    gp 4.3.4 /proc/$pid/fd/
    gp 4.3.5 /proc/$pid/statm
  gp 4.4 Kernel-Informationen
    gp 4.4.1 /proc/locks
    gp 4.4.2 /proc/modules
  gp 4.5 Filesysteme
    gp 4.5.1 /proc/mounts
  gp 4.6 Weiterführendes


Rheinwerk Computing

4.3 Prozessinformationedowntop

Neben Hardware-Informationen können Sie aus dem /proc-Filesystem auch Informationen zu den einzelnen Prozessen ermitteln. Auch Programme wie ps oder top nutzen diese Möglichkeit, um Ihnen Informationen zu einem Prozess zu liefern. Den Prozessen und deren Verwaltung ist extra noch ein Kapitel gewidmet. Das /proc-Filesystem beinhaltet für jeden Prozess extra ein Unterverzeichnis. Der Name des Verzeichnisses entspricht der Prozess-ID. Lassen Sie sich am besten das /proc-Verzeichnis ausgeben:

$ ls -l /proc | less
dr-xr-xr-x    3 root     root     0 2003–11–13 23:46 1
dr-xr-xr-x    3 root     root     0 2003–11–13 23:46 12
dr-xr-xr-x    3 root     root     0 2003–11–13 23:46 1201
dr-xr-xr-x    3 root     root     0 2003–11–13 23:46 1278
dr-xr-xr-x    3 bin      root     0 2003–11–13 23:46 1303 
...
dr-xr-xr-x    4 root     root     0 2003–11–13 23:47 tty
-r--r--r--    1 root     root     0 2003–11–13 23:47 uptime
-r--r--r--    1 root     root     0 2003–11–13 23:47 version
dr-xr-xr-x    3 root     root     0 2003–11–13 23:47 video

Diese Verzeichnisse werden als Prozessverzeichnisse bezeichnet, da sich diese auf die Prozess-ID (PID) beziehen (komischerweise taucht es in den 2.6er-Sources als »TGID« auf ...) und Informationen zu diesem Prozess beinhalten. Eigentümer und Gruppe eines jeden solchen PID-Verzeichnisses werden auf die ID des Benutzers, der den Prozess ausführt, gesetzt. (Eine nachträgliche Änderung über setuid() ändert nur den Eigentümer des Verzeichnisses, nicht den der Dateien.) Nach Beendigung des Prozesses wird der Eintrag im /proc-Verzeichnis ebenfalls wieder gelöscht. Während der Ausführung eines Prozesses können Sie aus dem Verzeichnis die nun folgenden nützlichen Informationen dazu erhalten:

#include <unistd. h.>
int main(void) { setuid(25); while(1); }

Im Hintergrund ausführen (»./a.out &«) und reingucken:

# ./a.out &
[1] 2275
# ls -l /proc/2275/
insgesamt 0
-r--r--r--  1 tot  users   0 2004–08–14 02:36   cmdline
-r--------  1 tot  users   0 2004–08–14 02:36   environ
lrwxrwxrwx  1 tot  users   0 2004–08–14 02:36   exe->./a.out
dr-x------  2 tot  users   0 2004–08–14 02:36
fd-rw------ 1 tot  users   0 2004–08–14 02:36   mapped_base
-r--r--r--  1 tot  users   0 2004–08–14 02:36   maps
-rw-------  1 tot  users   0 2004–08–14 02:36   mem
-r--r--r--  1 tot  users   0 2004–08–14 02:36   mounts
lrwxrwxrwx  1 tot  users   0 2004–08–14 02:36   root -> /
-r--r--r--  1 tot  users   0 2004–08–14 02:36   stat
-r--r--r--  1 tot  users   0 2004–08–14 02:36   statm
-r--r--r--  1 tot  users   0 2004–08–14 02:36   status

Gilt auch für seteuid() und setreuid().


Rheinwerk Computing

4.3.1 /proc/$pid/cmdline  downtop

Sie finden z. B. ein Verzeichnis mit der ID 2167 und wollen wissen, was in der Kommandozeile des Prozesses steht, dann müssen Sie nur cmdline abfragen:

$ cat /proc/2167/cmdline
anjuta

Der Prozess mit der ID 2167 ist also das Programm (die Entwicklungsumgebung) Anjuta bei der Ausführung. Wollen Sie alle Prozesse ausgeben lassen, können Sie dies auch folgendermaßen machen:

# cat /proc/[0–9]*/cmdline

Da die Ausgabe allerdings zu wünschen übrig lässt, sollten Sie hierfür das Kommando strings einsetzen:

# strings -f /proc/[0–9]*/cmdline

Und schon bekommen Sie alle zu den Prozess-IDs gehörenden Namen ausgegeben. Mit cmdline können Sie eine einzelne Zeile des Prozesses ausgeben, worin der Name (oder auch das Kommando) des Programms mit allen Argumenten enthalten ist.

Falls strings bei Ihnen nicht machen will, was es soll, können Sie auch folgende Eingabe verwenden:

# grep -Ha "" /proc/[0–9]*/cmdline | tr '\0' " "

Rheinwerk Computing

4.3.2 /proc/$pid/environ  downtop

Jeder Prozess hat außerdem auch eine Prozessumgebung. Welche Umgebungsvariablen für welchen Prozess gesetzt sind, können Sie mit environ im /proc-Verzeichnis der Prozess-ID erfragen. Hier soll weiterhin der Prozess mit der ID 2167, die Entwicklungsumgebung Anjuta, beobachtet werden:

$ strings -f /proc/2167/environ
/proc/2167/environ: LESSKEY=/etc/lesskey.bin
/proc/2167/environ:MANPATH=/usr/local/man:/usr/share/man:/..
/proc/2167/environ:INFODIR=/usr/local/info:/usr/share/...
/proc/2167/environ: NNTPSERVER=news 
...
/proc/2167/environ: KDE_FULL_SESSION=true
/proc/2167/environ: KDE_MULTIHEAD=false
/proc/2167/environ: SESSION_MANAGER=local/linux:/tmp/.IC...
/proc/2167/environ: KDE_STARTUP_ENV=linux;1068759934;528706;1890

Wenn es auch hier wieder nicht mit strings klappen sollte, dann sollten Sie es mit Folgendem probieren:

# tr '\0' '\n' < /proc/2167/environ

Rheinwerk Computing

4.3.3 /proc/self  downtop

Wollen Sie die aktuelle Prozess-ID Ihres eigenen Programms ermitteln, so können Sie /proc/self auswerten. Bei diesem Eintrag handelt es sich um einen symbolischen Link des aktuell laufenden Prozesses. Das aktuelle Programm sollten Sie aber nicht mit der Shell verwechseln (versuchen Sie selbst: ls -dl /proc/self und ls -dl /proc/$$). Diesen symbolischen Link können Sie mit der Funktion readlink() auslesen. Hier ein Listing, das demonstriert, wie Sie die Prozess-ID des aktuell laufenden Programms ermitteln können:

/* my_getpid.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd. h.>
int main (void) {
   char buf[64];
   int pid;
   memset(buf, '\0', sizeof(buf));
   readlink("/proc/self", buf, sizeof(buf) - 1);
   sscanf(buf, "%d", &pid);    
   printf("Meine Prozess-ID lautet: %d\n", pid);
   return EXIT_SUCCESS;
}

Das Programm bei seiner Ausführung:

$ gcc -o my_getpid my_getpid.c
$ ./my_getpid
Meine Prozess-ID lautet: 2256

Hinweis   Das Beispiel stellt natürlich nur eine Demonstration dar. In der Praxis werden Sie auf die Funktion getpid() für die Ermittlung der Prozess-ID des laufenden Programms zurückgreifen.



Rheinwerk Computing

4.3.4 /proc/$pid/fd/  downtop

Ein weiterer Eintrag ist fd, ein Unterverzeichnis, das alle Einträge von Filedeskiptoren beinhaltet, die ein Prozess geöffnet hat. Jeder Eintrag darin ist ein symbolischer Link, der auf eine bestimmte Datei lesend oder schreibend zurückgreift. Natürlich sind hierbei auch immer die Standard-Filedeskriptoren (0, 1, 2) enthalten (es sei denn, sie wurden geschlossen, was viele Dämonen etc. tun!). Öffnen Sie eine Konsole, und geben Sie ps ein:

$ ps
 PID TTY          TIME CMD
 1988 pts/1    00:00:00 bash
 2827 pts/1    00:00:00 ps

Wollen Sie jetzt wissen, welche Filedeskiptoren bash offen hat, machen Sie Folgendes:

$ ls -l /proc/1988/fd/
insgesamt 0
lrwx------ 1 tot   users   64 2003–11–14 00:50 0->/dev/pts/1
lrwx------ 1 tot   users   64 2003–11–14 00:50 1->/dev/pts/1
lrwx------ 1 tot   users   64 2003–11–14 00:50 2->/dev/pts/1

Hierbei können Sie die drei Standard-Filedeskriptoren als symbolischen Link auf dem Pseudo-Terminal pts/1 wieder erkennen. Sie können jetzt ohne weiteres auf diese Filedeskriptoren zugreifen:

$ echo "Ein Beweis gefällig?" > /proc/1988/fd/1
Ein Beweis gefällig?

Hier wurde die Standardausgabe von echo auf die eigentliche Standardausgabe des Pseudo-Terminals »geleitet«.


Rheinwerk Computing

4.3.5 /proc/$pid/statm  toptop

Informationen zur Speicherbelegung eines Prozesses werden im statm-File hinterlegt. Wollen Sie z. B. die Speicherbelegung der Entwicklungsumgebung Anjuta ermitteln, gehen Sie folgendermaßen vor:

$ cat /proc/2167/statm
2671 2670 1678 302 0 2368 992

Sie bekommen dabei sieben verschiedene Zahlen zurück. Hier die Bedeutung der einzelnen Zahlen von links nach rechts:

1. Gesamte Programmgröße in Kilobyte
       
2. Größe von Speicherteilen in Kilobyte
       
3. Anzahl von »geshareten« Seiten (so genannte Pages)
       
4. Anzahl Seiten von Programmcode
       
5. Anzahl Seiten von Stack/Daten
       
6. Anzahl Seiten von Bibliotheksprogrammcode
       
7. Anzahl von unsauberen Seiten
       

Es gibt noch weitere nützliche Informationen zu den Prozessen, die Sie jetzt in der folgenden Tabellen aufgelistet finden. $pid ersetzen Sie bitte für eine echte Prozess-ID.


Tabelle 4.2    Prozessinformationen in den individuellen PID-Verzeichnissen

Verzeichniseintrag Bedeutung
/proc/$pid/status Darin finden Sie die formatierten Informationen, die Sie ebenfalls mit /proc/$pid/stat (allerdings nicht formatiert) ermitteln können. Dies sind Informationen wie die Prozess-ID, die reale und effektive User- und Group-ID, Speicherverbrauch, Bitmasken usw.
/proc/$pid/stat Siehe /proc/$pid/status. Dies ist eine etwas kompaktere Datei, die sich besser als »status« mit sscanf() oder fscanf() verwenden lässt.
/proc/$pid/cwd Ein symbolischer Link zum aktuellen Arbeitsverzeichnis des Prozesses
/proc/$pid/exe Ein Verweis auf die ausführbare Programmdatei
/proc/$pid/root Ein Link zum Root-Verzeichnis, das als Wurzelverzeichnis für den Prozess gilt (siehe chroot())
/proc/$pid/maps Beinhaltet Speicher-Mappings zu den verschiedenen laufenden Dateien und Bibliotheken, die mit diesem Prozess zusammenhängen. Die Datei kann sehr lang werden, wenn ein umfangreicher Prozess ausgeführt wird.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern