GNU/Linux >> Tutoriels Linux >  >> Linux

Comment fonctionne la commande ps ?

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').


Linux
  1. Comment utiliser la commande basename ?

  2. Comment fonctionne le Sticky Bit ?

  3. Le but de .bashrc et comment ça marche ?

  4. Ssh – Comment Tcp-keepalive fonctionne-t-il dans Ssh ?

  5. Comment fonctionne la commande Exit sur un terminal Unix ?

Comment utiliser la commande Linux history

Comment utiliser la commande de lecture Bash

Comment utiliser la commande Linux xargs

Qu'est-ce que la commande source sous Linux et comment ça marche ?

Comment la commande stat calcule-t-elle les blocs d'un fichier ?

Comment fonctionne une interface graphique Linux au niveau le plus bas ?