GNU/Linux >> Linux Esercitazione >  >> Linux

Come funziona il comando ps?

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


Linux
  1. Come usare il comando Linux grep

  2. Come usare il comando cronologia in Linux

  3. Come funziona il bit appiccicoso?

  4. In uno script Bash Come funziona il comando Continua con i loop incorporati?

  5. Come funziona il comando Exit su un terminale Unix?

Come utilizzare il comando cronologia di Linux

Come utilizzare il comando di lettura Bash

Come utilizzare il comando xargs di Linux

Che cos'è il comando sorgente in Linux e come funziona?

Come funzionano le opzioni '-s', '-t' e '-c' del comando tr in Unix?

Come funziona una GUI Linux al livello più basso?