Solución:
Necesita analizar los datos de /proc/<PID>/stat
. Estos son los primeros campos (de Documentation/filesystems/proc.txt
en su fuente del 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 estas tras utime
y / o stime
. También necesitará leer el cpu
línea de /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. Necesita tomar la suma de los valores en esta línea para obtener un time_total
la medida.
Leer ambos utime
y stime
para el proceso que le interesa y lea time_total
de /proc/stat
. Luego duerme un segundo más o menos y léelos 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);
¿Tener sentido?
getrusage () puede ayudarlo a determinar el uso del proceso actual o su hijo
Actualizar:
No recuerdo una API. Pero todos los detalles estarán en / proc /PID/ stat, así que si pudiéramos analizarlo, obtendríamos el porcentaje.
EDITAR:
Dado que el% de CPU no es sencillo de calcular, puede usar el tipo de cosas de muestreo aquí. Lea ctime y utime para un PID en un momento determinado y vuelva a leer los mismos valores después de 1 segundo. Encuentra la diferencia y divide por cien. Obtendrá la utilización de ese proceso durante más de un segundo.
(puede volverse más complejo si hay muchos procesadores)
Paso a paso fácil para principiantes como yo:
- Lea la primera línea de
/proc/stat
Llegartotal_cpu_usage1
.
sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);
total_cpu_usage1 = user + nice + system + idle;
- Leer
/proc/pid/stat
dóndepid
es el PID del proceso que desea conocer el uso de la CPU, así:
sscanf(line,
"%*d %*s %*c %*d" //pid,command,state,ppid
"%*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu"
"%lu %lu" //usertime,systemtime
"%*ld %*ld %*ld %*ld %*ld %*ld %*llu"
"%*lu", //virtual memory size in bytes
....)
- Ahora suma
usertime
ysystemtime
y obtenproc_times1
- Ahora espera 1 segundo o más
- Hazlo de nuevo y obtén
total_cpu_usage2
yproc_times2
La formula es:
(number of processors) * (proc_times2 - proc_times1) * 100 / (float) (total_cpu_usage2 - total_cpu_usage1)
Puede obtener la cantidad de CPU de /proc/cpuinfo
.