¿Cómo funciona el comando ps?

¿Cómo funciona el comando ps?

Para una tarea necesito implementar mi propia versión del pscomando, pero no estoy seguro de dónde obtiene su información. ¿Dónde busco para encontrar toda la información del proceso?

Respuesta1

En Linux, el pscomando funciona leyendo archivos en elsistema de archivos proc. El directorio contiene varios archivos que proporcionan información sobre el proceso./proc/PIDPID. El contenido de estos archivos lo genera el núcleo sobre la marcha cuando un proceso los lee.

Puede encontrar documentación sobre las entradas en /procelpágina de manual de proc(5)y en eldocumentación del núcleo.

Puede descubrirlo usted mismo observando lo que pshace el comando constrace, un comando que enumera las llamadas al sistema realizadas por un proceso.

% 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

Respuesta2

Es posible que desee echar un vistazo a la /proccarpeta:
cada proceso que se ejecuta en su máquina tiene una subcarpeta aquí, con muchos archivos (en mi opinión, el más útil es comm, que proporciona el nombre del proceso).

Respuesta3

Funciona utilizando la biblioteca libprocps.so.

El formato principal es:

(A) iniciar (llamando a openproc())

(B) leer información del proceso (llamando a readproc() para cada uno)

(C) detener (llamar a closeproc())

El uso de libprocps.so ofrece ventajas (por ejemplo, le libera de codificar un montón de funciones de "análisis") y desventajas (tal vez desee menos información que la recopilada por las llamadas readproc()).

Un programa que usa libprocps.so tiene 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 ;
    }

procinfo contendrá toda la información de un proceso (como utime, stime, prioridad, nice, ppid, etc.) que ya está en formato numérico. Si descargaste las fuentes,proceso_tLa estructura se define en readproc.h.

ElOPCIONESLo que puedes usar en la llamada a openproc() son indicadores bit a bit, por lo que puedes usar uno o más de ellos, como:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

También están definidos en readproc.h (busque '#define PROC_FILLMEM').

información relacionada