Para una tarea necesito implementar mi propia versión del ps
comando, 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 ps
comando funciona leyendo archivos en elsistema de archivos proc. El directorio contiene varios archivos que proporcionan información sobre el proceso./proc/PID
PID. 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 /proc
elpágina de manual de proc(5)y en eldocumentación del núcleo.
Puede descubrirlo usted mismo observando lo que ps
hace 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 /proc
carpeta:
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').