LINUX.ORG.RU

определить процент использования CPU процессом


0

0

Господа разработчики, не подскажете, как написать (или где взять готовое, если есть) маленькую утилитку, которая по pid процесса возвращает текущий процент использования CPU этим процессом? Нужно нечто наподобие команды top, только гораздо проще. Исходники top я смотрел, но к сожалению, почти ничего в них не понял =(

anonymous

самый простой способ -- использовать виртуальную файловую систему procfs. для каждого запущенного процесса в процфс создаётся древовидная структура с информацией об этом процессе. тебя, прежде всего, будет интересовать файл /proc/PID/stat со статистической информацией о процессе (здесь, PID - номер процесса).

формат этого файла следующий (фрагмент утилиты top):

"%c "                                                                                                                        "%d %d %d %d %d "                                                                                                            "%lu %lu %lu %lu %lu %lu %lu "                                                                                               "%ld %ld %ld %ld %ld %ld "                                                                                                   "%lu %lu "                                                                                                                   "%ld "                                                                                                                       "%lu %lu %lu %lu %lu %lu "                                                                                                   "%*s %*s %*s %*s " /* discard, no RT signals & Linux 2.1 used hex */                                                         "%lu %lu %lu %*d %d",                                                                                                        

&P->state,                                                                                                                   &P->ppid, &P->pgrp, &P->session, &P->tty, &P->tpgid,                                                                         &P->flags, &P->min_flt, &P->cmin_flt, &P->maj_flt, &P->cmaj_flt, &P->utime, &P->stime,                                       &P->cutime, &P->cstime, &P->priority, &P->nice, &P->timeout, &P->it_real_value,                                              &P->start_time, &P->vsize,                                                                                                   &P->rss,                                                                                                                     &P->rss_rlim, &P->start_code, &P->end_code, &P->start_stack, &P->kstk_esp, &P->kstk_eip,                              /*     P->signal, P->blocked, P->sigignore, P->sigcatch,   */ /* can't use */                                                       &P->wchan, &P->nswap, &P->cnswap /* , &P->exit_signal  */, &P->lproc                                  

jc //urk

anonymous
()

самый простой способ -- использовать виртуальную файловую систему procfs. для каждого запущенного процесса в процфс создаётся древовидная структура с информацией об этом процессе. тебя, прежде всего, будет интересовать файл /proc/PID/stat со статистической информацией о процессе (здесь, PID - номер процесса).

формат этого файла следующий (фрагмент утилиты top):

"%c " "%d %d %d %d %d " "%lu %lu %lu %lu %lu %lu %lu " "%ld %ld %ld %ld %ld %ld " "%lu %lu " "%ld " "%lu %lu %lu %lu %lu %lu " "%*s %*s %*s %*s " /* discard, no RT signals & Linux 2.1 used hex */ "%lu %lu %lu %*d %d",

&P->state, &P->ppid, &P->pgrp, &P->session, &P->tty, &P->tpgid, &P->flags, &P->min_flt, &P->cmin_flt, &P->maj_flt, &P->cmaj_flt, &P->utime, &P->stime, &P->cutime, &P->cstime, &P->priority, &P->nice, &P->timeout, &P->it_real_value, &P->start_time, &P->vsize, &P->rss, &P->rss_rlim, &P->start_code, &P->end_code, &P->start_stack, &P->kstk_esp, &P->kstk_eip, /* P->signal, P->blocked, P->sigignore, P->sigcatch, */ /* can't use */ &P->wchan, &P->nswap, &P->cnswap /* , &P->exit_signal */, &P->lproc

jc //urk

anonymous
()

P -- это структура такого вида:

typedef struct proc_s { #ifdef SIGNAL_STRING char /* Linux 2.1.7x and up have more signals. This handles 88. */ signal[24], /* mask of pending signals */ blocked[24], /* mask of blocked signals */ sigignore[24], /* mask of ignored signals */ sigcatch[24]; /* mask of caught signals */ #else long long /* Linux 2.1.7x and up have more signals. This handles 64. */ signal, /* mask of pending signals */ blocked, /* mask of blocked signals */ sigignore, /* mask of ignored signals */ sigcatch; /* mask of caught signals */ #endif long cutime, /* cumulative utime of process and reaped children */ cstime, /* cumulative stime of process and reaped children */ priority, /* kernel scheduling priority */ timeout, /* ? */ nice, /* standard unix nice level of process */ rss, /* resident set size from /proc/#/stat */ it_real_value, /* ? */ /* the next 7 members come from /proc/#/statm */ size, /* total # of pages of memory */ resident, /* number of resident set (non-swapped) pages (4k) */ share, /* number of pages of shared (mmap'd) memory */ trs, /* text resident set size */ lrs, /* shared-lib resident set size */ drs, /* data resident set size */ dt; /* dirty pages */

anonymous
()

чёртов форум, всё изгадил. мылом кину короче :)
jc //urk

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.