Como o comando ps funciona?

4

Para uma tarefa, preciso implementar minha própria versão do comando ps , mas não tenho certeza de onde ela obtém as informações. Onde procuro encontrar todas as informações do processo?

    
por Muhammad Ilyas 14.02.2016 / 11:40

3 respostas

6

No Linux, o comando ps funciona lendo arquivos no sistema de arquivos proc . O diretório /proc/PID contém vários arquivos que fornecem informações sobre o processo PID . O conteúdo desses arquivos é gerado em tempo real pelo kernel quando um processo os lê.

Você pode encontrar documentação sobre as entradas em /proc na página man proc (5) e na documentação do kernel .

Você pode descobrir isso sozinho observando o que o comando ps faz com strace , um comando que lista as chamadas do sistema feitas por um 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
…
    
por 14.02.2016 / 23:19
3

Você pode querer dar uma olhada na pasta /proc :
Todo processo rodando na sua máquina tem uma subpasta aqui, com muitos arquivos (o mais útil é o comm , que dá o nome do processo).

    
por 14.02.2016 / 11:50
2

Funciona usando a biblioteca libprocps.so.

O formato principal é:

(A) start (chamando openproc ())

(B) lendo informação do processo (chamando readproc () para cada um)

(C) parar (chamando closeproc ())

Usar o libprocps.so traz vantagens (por exemplo, liberar você da codificação de várias funções de "análise") e desvantagens (talvez você queira menos informações do que as reunidas pelo readproc ()).

Um programa usando o libprocps.so possui este formato básico.

    #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 ;
    }

O procinfo conterá todas as informações para um processo (como utime, stime, priority, nice, ppid, etc) já em formato numérico. Se você baixou as fontes, proc_t struct está definido em readproc.h

As OPÇÕES que você pode usar na chamada openproc () são bitwise ou flags, então você pode usar uma ou mais das seguintes, como:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

Eles também são definidos em readproc.h (procure por '#define PROC_FILLMEM').

Desculpe por inglês pobre, e espero que isso ajude um pouco.

    
por 17.11.2017 / 20:38

Tags