C获得linux和Windows上的CPU使用情况

我在linux和windows上使用下面的程序来获取当前进程的CPU利用率。

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”)命令没有执行任何cpu周期? 我如何得到任何命令或程序使用的确切的CPU周期?

我在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 <directory listing> Time in kernel mode: 0h 0m 0s 15ms Time in user mode: 0h 0m 0s 15ms 

你可以让我知道我们如何得到正确的CPU使用上述程序? 还有一种方法来了解IO使用情况或读取和写入磁盘/内存的字符数? 提前致谢。

在Linux版本中,您要求RUSAGE_SELF (这是父进程的所有线程),而不是RUSAGE_CHILDREN (子进程)。 对于Linux下的IO使用情况,在2.6.20之后需要一个内核,并查看/proc/[pid]/io

我想你在Windows上有类似的问题。 您将需要使用CreateProcess而不是system ,以便您可以获取子进程的句柄并记录其时间。 对于Windows上的IO使用,我认为你需要使用WMI,这是一个很大的主题。

这是正确的输出。 ls不是目前的过程; 当ls正在执行时,没有CPU时间花在你的进程上。

顺便说一句,Dev-C ++只是一个[坏的,没有维护的] IDE,而不是编译器。 你可能打算说MinGW。

你在这里的linux版本中犯了一些错误。

  1. 正如Adrian指出的那样,您应该使用RUSAGE_CHILDREN来计算子进程使用的资源。
  2. 在调用system()之后,你没有再调用getrusage() system()
  3. 在你的printf() ,你不应该使用代表long double类型的%lftv_sec的类型是time_ttv_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);