Für eine Aufgabe muss ich meine eigene Version des ps
Befehls implementieren, bin mir aber nicht sicher, woher sie die Informationen bezieht. Wo finde ich alle Prozessinformationen?
Antwort1
Unter Linux ps
funktioniert der Befehl durch Lesen von Dateien improc-Dateisystem. Das Verzeichnis enthält verschiedene Dateien, die Informationen über den Prozess liefern/proc/PID
PID. Der Inhalt dieser Dateien wird vom Kernel spontan generiert, wenn ein Prozess sie liest.
Eine Dokumentation der Einträge finden Sie /proc
imman-Seite zu proc(5)und in derKernel-Dokumentation.
Sie können dies selbst herausfinden, indem Sie beobachten, was der ps
Befehl 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 /proc
Ordner 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“).