C получить использование процессора в linux и windows

Я использую ниже программы на linux и windows, чтобы получить текущее использование процессора.

Linux:

int main() { int ret; char *buf; int i=0; int who= RUSAGE_SELF; struct rusage usage; struct rusage *p=&usage; ret=getrusage(who,p); printf("user time used: %16lf %16lf\n",p->ru_utime.tv_sec,p->ru_utime.tv_usec); printf("system time used: %16lf %16lf\n",p->ru_stime.tv_sec,p->ru_stime.tv_usec); system("ls"); printf("user time used: %16lf %16lf\n",p->ru_utime.tv_sec,p->ru_utime.tv_usec); printf("system time used: %16lf %16lf\n", p->ru_stime.tv_sec,p->ru_stime.tv_usec); return 0; } 

Выход на Linux:

 user time used: 0.000000 -1.999568 system time used: 0.000000 -1.999568 a.out check.c user time used: 0.000000 -1.999568 system time used: 0.000000 -1.999568 

Означает ли это, что команда системы («ls») не выполняла циклы процессора? Как получить точные циклы процессора, используемые любой командой или программой?

Я сталкиваюсь с аналогичными проблемами на windowsх. для кода ниже.

Окна:

 int main() { int i=0; HANDLE hProcess = GetCurrentProcess(); FILETIME ftCreation, ftExit, ftKernel, ftUser; SYSTEMTIME stKernel; SYSTEMTIME stUser; GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); FileTimeToSystemTime(&ftKernel, &stKernel); FileTimeToSystemTime(&ftUser, &stUser); printf("\nTime in kernel mode = %uh %um %us %ums", stKernel.wHour,stKernel.wMinute, stKernel.wSecond, stKernel.wMilliseconds); printf("\nTime in user mode = %uh %um %us %ums \n", stUser.wHour,stUser.wMinute, stUser.wSecond, stUser.wMilliseconds); system("dir"); GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); FileTimeToSystemTime(&ftKernel, &stKernel); FileTimeToSystemTime(&ftUser, &stUser); printf("\nTime in kernel mode = %uh %um %us %ums", stKernel.wHour,stKernel.wMinute, stKernel.wSecond, stKernel.wMilliseconds); printf("\nTime in user mode = %uh %um %us %ums \n", stUser.wHour,stUser.wMinute, stUser.wSecond, stUser.wMilliseconds); system("PAUSE"); return 0; } 

Над выводом программы на windows dev c ++:

 Time in kernel mode: 0h 0m 0s 15ms Time in user mode: 0h 0m 0s 15ms  Time in kernel mode: 0h 0m 0s 15ms Time in user mode: 0h 0m 0s 15ms 

Не могли бы вы сообщить мне, как мы можем получить правильное использование процессора для вышеуказанных программ? Также есть ли способ узнать об использовании IO или количестве символов, которые читаются и записываются на диск / память? Заранее спасибо.

В версии Linux вы запросили RUSAGE_SELF , который представляет собой все streamи родительского процесса, а не RUSAGE_CHILDREN для дочерних процессов. Для использования IO в Linux вам понадобится kernel ​​после 2.6.20, и посмотрите в /proc/[pid]/io .

Я думаю, что у вас аналогичная проблема в Windows. Вам нужно будет использовать CreateProcess а не system , чтобы вы могли обработать дочерний процесс и записать его время. Для использования IO в windowsх я думаю, вам нужно использовать WMI, который является большой темой.

Это правильный вывод. ls не является текущим процессом; в то время как ls выполняется, процессорное время не тратится на ваш процесс.

BTW Dev-C ++ – это просто [bad, unmaintained] IDE, а не компилятор. Вероятно, вы хотели сказать MinGW.

Вы сделали несколько ошибок в версии Linux.

  1. Как указал Адриан, вы должны использовать RUSAGE_CHILDREN для подсчета ресурсов, потребляемых дочерним процессом.
  2. Вы снова не вызывали getrusage() после вызова system() .
  3. В вашем printf() вы не должны использовать %lf который представляет собой длинный двойной тип. tv_sec имеет тип time_t а tv_usec имеет тип susecond_t . В 64-битном Linux они оба signed long , что несовместимо с long double (обратите внимание, что здесь есть отрицательный результат). Для переносимости вы должны были использовать явное выражение, например:

     printf("user time used: %ld %ld\n",(long)p->ru_utime.tv_sec,(long)p->ru_utime.tv_usec);