Команда top
вычисляет загрузку ЦП, используя данные в файловой системе proc . Фактический файл, содержащий данные об использовании процессора, может варьироваться от одной платформы к другой. Например, в Linux он находится в /proc/<pid>/stat
, а в Solaris - в /proc/<pid>/psinfo
. Использование ЦП рассчитывается как разница в суммарном времени ЦП для процесса, деленная на количество времени, измеренное между обновлениями.
Для Linux вы можете проверить источник procps , который включает ps
, top
, и другой инструмент обработки из http://procps.sourceforge.net. The * В частности, файл 1022 * readproc.c содержит функции для извлечения данных.
Для Solaris вы можете проверить источник libproc из https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc. Файл prog_get_info.c содержит функции для извлечения данные и хранение их в psinfo_t
структуре.
Для Linux, Solaris и других систем вы можете проверить исходный код Unix Top из http://sourceforge.net/projects/unixtop. Исходные файлы для платформы в machine
каталог содержит функциональность для извлечения данных.
Обновление
Другой вариант (только Solaris) для получения времени ЦП для процесса может быть передан параметру PIOCPSINFO
или PIOCSTATUS
параметру ioctl()
системный вызов. Опция PIOCPSINFO
возвращает различную информацию о процессе в структуре prpsinfo_t
. Опция PIOCSTATUS
возвращает информацию о состоянии процесса в prstatus_t
struct.
Адаптировано из примера кода на 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);
}
Примечание. Этот код не проверен и для простоты исключает проверку ошибок.