Debe analizar los datos de /proc/<PID>/stat
. Estos son los primeros campos (desde Documentation/filesystems/proc.txt
en la fuente de su kernel):
Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
..............................................................................
Field Content
pid process id
tcomm filename of the executable
state state (R is running, S is sleeping, D is sleeping in an
uninterruptible wait, Z is zombie, T is traced or stopped)
ppid process id of the parent process
pgrp pgrp of the process
sid session id
tty_nr tty the process uses
tty_pgrp pgrp of the tty
flags task flags
min_flt number of minor faults
cmin_flt number of minor faults with child's
maj_flt number of major faults
cmaj_flt number of major faults with child's
utime user mode jiffies
stime kernel mode jiffies
cutime user mode jiffies with child's
cstime kernel mode jiffies with child's
Probablemente estés buscando utime
y/o stime
. También necesitarás leer el cpu
línea desde /proc/stat
, que se parece a:
cpu 192369 7119 480152 122044337 14142 9937 26747 0 0
Esto le indica el tiempo de CPU acumulado que se ha utilizado en varias categorías, en unidades de jiffies. Debe tomar la suma de los valores en esta línea para obtener un time_total
medir.
Leer ambos utime
y stime
para el proceso que le interesa y lea time_total
de /proc/stat
. Luego duerma por un segundo más o menos, y léalos todos de nuevo. Ahora puede calcular el uso de CPU del proceso durante el tiempo de muestreo, con:
user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);
sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);
¿Tiene sentido?
getrusage() puede ayudarlo a determinar el uso del proceso actual o su hijo
Actualización: No puedo recordar una API. Pero todos los detalles estarán en /proc/PID /stat, así que si pudiéramos analizarlo, podemos obtener el porcentaje.
EDITAR: Dado que el porcentaje de CPU no es sencillo de calcular, aquí podría usar cosas de muestreo. Lea ctime y utime para un PID en un punto en el tiempo y lea los mismos valores nuevamente después de 1 segundo. Encuentra la diferencia y divide por cien. Obtendrá la utilización de ese proceso durante el último segundo.
(podría volverse más complejo si hay muchos procesadores)