Komenda top
oblicza użycie procesora przy użyciu danych z proc file system. Rzeczywisty plik zawierający dane o wykorzystaniu procesora może się różnić w zależności od platformy. Na przykład w Linuksie można go znaleźć pod numerem /proc/<pid>/stat
, a w systemie Solaris - w /proc/<pid>/psinfo
. Wykorzystanie procesora jest obliczane jako różnica w łącznym czasie procesora dla procesu podzielona przez czas mierzony między aktualizacjami.
Dla Linuksa, można sprawdzić źródło procps który zawiera ps
, top
i inne narzędzia procesowe od http://procps.sourceforge.net. W szczególności plik readproc.c zawiera funkcję pobierania danych.
Dla Solaris można skontrolować źródło z https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproclibproc. Plik prog_get_info.c zawiera funkcje pobierania danych i przechowywania ich w strukturze psinfo_t
.
dla systemów Linux, Solaris i innych, można sprawdzić źródło Unix Top z http://sourceforge.net/projects/unixtop. Pliki źródłowe specyficzne dla platformy w katalogu machine
zawierają funkcje pobierania danych.
Aktualizacja
Inną opcją (tylko Solaris) do pobierania czasu procesora dla procesu można przechodząc do opcji do wywołania systemowego ioctl()
PIOCPSINFO
lub PIOCSTATUS
. Opcja PIOCPSINFO
zwraca różne informacje o procesach w strukturze prpsinfo_t
. Opcja PIOCSTATUS
zwraca informacje o statusie dla procesu w strukturze prstatus_t
.
adaptowany z przykładowym kodem w 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);
}
Uwaga: Ten kod jest niesprawdzone i pomija sprawdzanie błędów dla prostoty.
Nie powielać ale powiązanych - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder