C++如何计算CPU/内存使用率

5
我有一个名为./blah(我有源代码)的C++应用程序。
当我运行./blah时,我可以运行“top”命令,查看“./blah”正在使用多少内存和CPU。
现在,是否有任何方法让“./blah”自己访问该信息?也就是说,当我运行./blah时,我希望它每秒钟都能输出CPU和内存的使用情况。哪个库应该用于此操作?
我使用的是MacOSX,但我希望解决方案也适用于Linux。
谢谢!

2
Mac OSX和Linux都是Posix兼容的,如果我没记错的话。你不会找到一个符合C++标准的解决方案,但是一个符合Posix标准的解决方案应该适合你。我不知道具体的调用方法,但如果这个信息在一个符合Posix标准的库中不可用,我会感到惊讶的。 - user180247
3个回答

12

你需要使用 getrusage() 函数。根据man page

int getrusage(int who, struct rusage *r_usage);

getrusage() 返回描述当前进程或其所有已终止子进程所使用资源的信息。参数 who 可以是 RUSAGE_SELFRUSAGE_CHILDREN。指向缓冲区的指针 r_usage 将被填充以下结构体:

struct rusage {
         struct timeval ru_utime; /* user time used */
         struct timeval ru_stime; /* system time used */
         long ru_maxrss;          /* integral max resident set size */
         long ru_ixrss;           /* integral shared text memory size */
         long ru_idrss;           /* integral unshared data size */
         long ru_isrss;           /* integral unshared stack size */
         long ru_minflt;          /* page reclaims */
         long ru_majflt;          /* page faults */
         long ru_nswap;           /* swaps */
         long ru_inblock;         /* block input operations */
         long ru_oublock;         /* block output operations */
         long ru_msgsnd;          /* messages sent */
         long ru_msgrcv;          /* messages received */
         long ru_nsignals;        /* signals received */
         long ru_nvcsw;           /* voluntary context switches */
         long ru_nivcsw;          /* involuntary context switches */
 };

愚蠢的问题:我怎么才能从中获取% CPU? - anon
你知道用户/系统使用了多少时间,将其除以实际时间,这就是你使用的 CPU 时间,对吧? - Carl Norum
那真的是%cpu的定义吗?它看起来太简单了。 - anon
@anon,你的定义会是什么? - Carl Norum
1
修复了,感谢 @FelixJassler 的提示。 - Carl Norum

1

Linux 在以下位置提供此信息:

/proc/<pid>/stat

你可以使用以下代码来获取当前的进程ID:

getpid()

返回pid_t。

这里有一段代码,以合理的格式显示该信息:http://brokestream.com/procstat.html

我不知道这是否适用于Mac OSX。

编辑:Mac OS X没有procfs文件系统,因此这对Mac OSX不起作用,抱歉!


很抱歉,在OS X上没有/proc - Carl Norum
@Carl 谢谢,我在看到你的评论之前快速搜索并进行了编辑。下面还有更好的解决方案。 - user257111
如果您从感兴趣的进程中调用此函数,则可以直接使用“/proc/self/stat”。 - parsley72

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接