Wie funktioniert der PS-Befehl?

Wie funktioniert der PS-Befehl?

Für eine Aufgabe muss ich meine eigene Version des psBefehls implementieren, bin mir aber nicht sicher, woher sie die Informationen bezieht. Wo finde ich alle Prozessinformationen?

Antwort1

Unter Linux psfunktioniert der Befehl durch Lesen von Dateien improc-Dateisystem. Das Verzeichnis enthält verschiedene Dateien, die Informationen über den Prozess liefern/proc/PIDPID. Der Inhalt dieser Dateien wird vom Kernel spontan generiert, wenn ein Prozess sie liest.

Eine Dokumentation der Einträge finden Sie /procimman-Seite zu proc(5)und in derKernel-Dokumentation.

Sie können dies selbst herausfinden, indem Sie beobachten, was der psBefehl mitstrace, ein Befehl, der die von einem Prozess getätigten Systemaufrufe auflistet.

% strace -e open ps
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libprocps.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY)       = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/proc/sys/kernel/pid_max", O_RDONLY) = 4
open("/proc/meminfo", O_RDONLY)         = 4
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/2/stat", O_RDONLY)          = 6
open("/proc/2/status", O_RDONLY)        = 6
open("/proc/3/stat", O_RDONLY)          = 6
open("/proc/3/status", O_RDONLY)        = 6

% strace -e open ps
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/1/cmdline", O_RDONLY)       = 6

Antwort2

Sie sollten einen Blick in den /procOrdner werfen:
Jeder auf Ihrem Computer ausgeführte Prozess hat hier einen Unterordner mit zahlreichen Dateien (der nützlichste ist meiner Meinung nach comm, da er den Namen des Prozesses angibt).

Antwort3

Es funktioniert mithilfe der Bibliothek libprocps.so.

Das Hauptformat ist:

(A) starten (Aufruf von openproc())

(B) Lesen von Prozessinformationen (durch Aufrufen von readproc() für jeden Prozess)

(C) stoppen (Aufruf von closeproc())

Die Verwendung von libprocps.so bietet Vorteile (Sie müssen beispielsweise nicht mehr eine Reihe von „Parsing“-Funktionen codieren) und Nachteile (vielleicht benötigen Sie weniger Informationen, als durch readproc()-Aufrufe gesammelt werden).

Ein Programm, das libprocps.so verwendet, hat dieses grundlegende Format.

    #include <proc/readproc.h>
         :
    int main()
   {
         :
       PROCTAB *proctab = openproc(<OPTIONS>) ;
         :
         :
       proc_t procinfo ;
       memset(&procinfo, 0, sizeof(procinfo)) ;
       while(readproc(proctab, &procinfo) != nullptr)
       {
          <do something with procinfo data>
       }
         :
         :
       closeproc(proctab) ;
       return 0 ;
    }

procinfo enthält alle Informationen zu einem Prozess (wie utime, stime, priority, nice, ppid usw.) bereits im numerischen Format. Wenn Sie die Quellen heruntergeladen haben,proc_tStruktur ist in readproc.h definiert

DerOPTIONENSie können im Aufruf von openproc() bitweise ODER-Flags verwenden, Sie können also eines oder mehrere davon verwenden, wie:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

Sie sind auch in readproc.h definiert (suchen Sie nach „#define PROC_FILLMEM“).

verwandte Informationen