Su Linux, ps
comando funziona leggendo i file nel filesystem proc. La cartella /proc/PID
contiene vari file che forniscono informazioni sul processo PID . Il contenuto di questi file viene generato al volo dal kernel quando un processo li legge.
Puoi trovare la documentazione sulle voci in /proc
nella pagina man di proc(5) e nella documentazione del kernel.
Puoi scoprirlo da solo osservando ciò che il ps
comando funziona con strace
, un comando che elenca le chiamate di sistema effettuate da un processo.
% 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
…
Potresti voler dare un'occhiata al /proc
cartella:
Ogni processo in esecuzione sulla tua macchina ha una sottocartella qui, con molti file (l'IMO più utile è comm
, che fornisce il nome del processo.)
Funziona utilizzando la libreria libprocps.so.
Il formato principale è :
(A) start (chiamando openproc())
(B) leggere le informazioni del processo (chiamando readproc() per ognuno)
(C) stop ( chiamando closeproc())
L'uso di libprocps.so offre vantaggi (ad esempio, liberandoti dalla codifica di una serie di funzioni di "analisi") e svantaggi (forse desideri meno informazioni rispetto a quelle raccolte dalle chiamate readproc()).
Un programma che usa libprocps.so ha questo formato di base.
#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 manterrà tutte le informazioni per un processo (come utime, sti, priority, nice, ppid, ecc.) già in formato numerico. Se hai scaricato i sorgenti, proc_t struct è definito in readproc.h
Le OPZIONI che puoi usare nella chiamata openproc() sono bit per bit o flag, quindi puoi usarne uno o più, come :
PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;
Sono definiti anche in readproc.h (cerca '#define PROC_FILLMEM').