Sous Linux, le ps
La commande fonctionne en lisant les fichiers dans le système de fichiers proc. Le répertoire /proc/PID
contient divers fichiers qui fournissent des informations sur le processus PID . Le contenu de ces fichiers est généré à la volée par le noyau lorsqu'un processus les lit.
Vous pouvez trouver de la documentation sur les entrées dans /proc
dans la page de manuel proc(5) et dans la documentation du noyau.
Vous pouvez le découvrir par vous-même en observant ce que le ps
commande fait avec strace
, une commande qui répertorie les appels système effectués par un processus.
% 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
…
Vous voudrez peut-être jeter un coup d'œil dans le /proc
dossier:
Chaque processus en cours d'exécution sur votre machine a un sous-dossier ici, avec beaucoup de fichiers (l'IMO le plus utile étant comm
, qui donne le nom du processus.)
Cela fonctionne en utilisant la bibliothèque libprocps.so.
Le format principal est :
(A) démarrer (appeler openproc())
(B) lire les informations du processus (en appelant readproc() pour chacun)
(C) stop ( appelant closeproc())
L'utilisation de libprocps.so présente des avantages (par exemple, vous évite de coder un tas de fonctions "d'analyse") et des inconvénients (peut-être voulez-vous moins d'informations que celles recueillies par les appels readproc()).
Un programme utilisant libprocps.so a ce format de 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 contiendra toutes les informations d'un processus (comme utime, stime, priority, nice, ppid, etc.) déjà au format numérique. Si vous avez téléchargé les sources, proc_t struct est défini dans readproc.h
Les OPTIONS vous pouvez utiliser dans l'appel openproc() des drapeaux bitwise-or, vous pouvez donc en utiliser un ou plusieurs, comme :
PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;
Ils sont également définis dans readproc.h (recherchez '#define PROC_FILLMEM').