Unter Linux der ps
Der Befehl funktioniert, indem er Dateien im proc-Dateisystem liest. Das Verzeichnis /proc/PID
enthält verschiedene Dateien, die Informationen über den Prozess PID liefern . Der Inhalt dieser Dateien wird im laufenden Betrieb vom Kernel generiert, wenn ein Prozess sie liest.
Eine Dokumentation zu den Einträgen finden Sie in /proc
in der Manpage proc(5) und in der Kernel-Dokumentation.
Sie können dies selbst herausfinden, indem Sie die ps
beobachten Befehl tut mit strace
, ein Befehl, der die Systemaufrufe eines Prozesses 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
…
Vielleicht möchten Sie einen Blick in /proc
werfen Mappe:
Jeder Prozess, der auf Ihrem Rechner läuft, hat hier einen Unterordner mit vielen Dateien (der nützlichste IMO ist comm
, die den Namen des Prozesses angibt.)
Es funktioniert mit der Bibliothek libprocps.so.
Das Hauptformat ist :
(A) start (Aufruf von openproc())
(B) Informationen des Prozesses lesen (readproc() für jeden aufrufen)
(C) stop (Aufruf von closeproc())
Die Verwendung von libprocps.so bietet Vorteile (z. B. die Befreiung vom Programmieren einer Reihe von "Parsing"-Funktionen) und Nachteile (vielleicht möchten Sie weniger Informationen als durch Aufrufe von readproc() 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 für einen Prozess (wie utime, stime, Priorität, nice, ppid usw.) bereits im numerischen Format. Wenn Sie die Quellen heruntergeladen haben, proc_t struct ist in readproc.h
definiertDie OPTIONEN Sie können im openproc()-Aufruf bitweise ODER-Flags verwenden, also können Sie eines oder mehrere von then als :
verwenden PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;
Sie sind auch in readproc.h definiert (suchen Sie nach '#define PROC_FILLMEM').