Como funciona o comando ps?

Como funciona o comando ps?

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

Responder1

No Linux, o pscomando funciona lendo arquivos nosistema de arquivos proc. O diretório contém vários arquivos que fornecem informações sobre o processo/proc/PIDPID. O conteúdo desses arquivos é gerado dinamicamente pelo kernel quando um processo os lê.

Você pode encontrar documentação sobre as entradas /procnopágina de manual proc(5)E nodocumentação do kernel.

Você pode descobrir isso observando o que o pscomando faz comstrace, 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

Responder2

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

Responder3

Funciona usando a biblioteca libprocps.so.

O formato principal é:

(A) iniciar (chamar openproc())

(B) lendo informações do processo (chamando readproc() para cada um)

(C) parar (chamando closeproc())

Usar libprocps.so oferece vantagens (por exemplo, liberando você de codificar um monte de funções de "análise") e desvantagens (talvez você queira menos informações do que as coletadas por chamadas readproc()).

Um programa que usa libprocps.so possui esse 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 ;
    }

procinfo armazenará todas as informações de um processo (como utime, stime, prioridade, nice, ppid, etc) já em formato numérico. Se você baixou as fontes,proc_tstruct é definido em readproc.h

OOPÇÕESque você pode usar na chamada openproc() são sinalizadores bit a bit ou, então você pode usar um ou mais deles, como:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

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

informação relacionada