GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo funciona el comando ps?

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').


Linux
  1. Cómo usar el comando grep de Linux

  2. Cómo usar el comando de historial en Linux

  3. ¿Cómo funciona la punta adhesiva?

  4. ¿Cómo funciona el comando Exit en una terminal Unix?

  5. ¿Cómo calcula el comando stat los bloques de un archivo?

Cómo usar el comando de historial de Linux

Cómo usar el comando de lectura Bash

Cómo usar el comando xargs de Linux

¿Qué es el comando fuente en Linux y cómo funciona?

¿Cómo funcionan las opciones '-s', '-t' y '-c' del comando tr en Unix?

¿Cómo funciona una GUI de Linux en el nivel más bajo?