En Linux, el ps
El comando funciona leyendo archivos en el sistema de archivos proc. El directorio /proc/PID
contiene varios archivos que proporcionan información sobre el proceso PID . El kernel genera el contenido de estos archivos sobre la marcha cuando un proceso los lee.
Puede encontrar documentación sobre las entradas en /proc
en la página man de proc(5) y en la documentación del núcleo.
Puedes averiguarlo por ti mismo observando lo que ps
comando hace con strace
, 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
…
Es posible que desee echar un vistazo en el /proc
carpeta:
Cada proceso que se ejecuta en su máquina tiene una subcarpeta aquí, con muchos archivos (el IMO más útil es comm
, que da el nombre del proceso.)
Funciona usando la biblioteca libprocps.so.
El formato principal es:
(A) inicio (llamando a openproc())
(B) leyendo información del proceso (llamando a readproc() para cada uno)
(C) detener ( llamar a closeproc())
El uso de libprocps.so brinda ventajas (por ejemplo, lo 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, agradable, ppid, etc.) ya en formato numérico. Si descargó las fuentes, proc_t la estructura se define en readproc.h
Las OPCIONES puede usar en la llamada openproc() bit a bit o indicadores, por lo que puede 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').