El comando top
calcula el uso de la CPU utilizando los datos en el proc file system. El archivo real que contiene los datos de uso de la CPU puede variar de una plataforma a otra. Por ejemplo, en Linux se encuentra en /proc/<pid>/stat
y para Solaris se encuentra en /proc/<pid>/psinfo
. El uso de la CPU se calcula como la diferencia en el tiempo acumulativo de CPU para un proceso dividido por la cantidad de tiempo medido entre las actualizaciones.
Para Linux, se puede inspeccionar la fuente procps que incluye ps
, top
, y otra herramienta de proceso de http://procps.sourceforge.net. El archivo readproc.c en particular contiene la funcionalidad para recuperar los datos.
Para Solaris, puede inspeccionar la fuente de https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproclibproc. El archivo prog_get_info.c contiene la funcionalidad para recuperar los datos y almacenarlos en una estructura psinfo_t
.
Para Linux, Solaris, y otros, se puede inspeccionar la fuente de Unix Tophttp://sourceforge.net/projects/unixtop. Los archivos fuente específicos de la plataforma dentro del directorio machine
contienen la funcionalidad para recuperar los datos.
actualización
Otra opción (Solaris) para recuperar el tiempo de CPU para un proceso puede estar pasando a la opción PIOCPSINFO
o PIOCSTATUS
a la llamada ioctl()
sistema. La opción PIOCPSINFO
devuelve información de proceso miscelánea en una estructura prpsinfo_t
. La opción PIOCSTATUS
devuelve información de estado para el proceso en una estructura prstatus_t
.
Adaptado de ejemplo de código en http://getthegood.com/TechNotes/Papers/ProcStatistics.html:
int main(int argc, char* argv[])
{
int fd;
prpsinfo_t info;
prstatus_t status;
char procbuf[50];
sprintf(procbuf, "/proc/%d", getpid());
fd = open(procbuf, O_RDONLY);
ioctl(fd, PIOCPSINFO, &info);
printf("Process user+sys time = %ld sec %ld nsec\n"
"Reaped children user+sys time = %ld sec %ld nsec\n",
info.pr_time.tv_sec, info.pr_time.tv_nsec,
info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec);
ioctl(fd, PIOCSTATUS, &status);
printf("Process user+sys time = %ld sec %ld nsec\n"
"Sum of children's user+sys time = %ld sec %ld nsec\n",
status.pr_utime.tv_sec+status.pr_stime.tv_sec,
status.pr_utime.tv_nsec+status.pr_stime.tv_nsec,
status.pr_cutime.tv_sec+status.pr_cstime.tv_sec,
status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec);
close(fd);
exit(0);
}
Nota: Este código no se ha probado y omite la comprobación de errores por simplicidad.
No duplicado pero relacionado - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder