我有一个具有以下成员函数的类:
/// caller pid virtual pid_t Pid() const = 0; /// physical memory size in KB virtual uint64_t Size() const = 0; /// resident memory for this process virtual uint64_t Rss() const = 0; /// cpu used by this process virtual double PercentCpu() const = 0; /// memory used by this process virtual double PercentMemory() const = 0; /// number of threads in this process virtual int32_t Lwps() const = 0;
这个类的职责是返回有关调用者的进程信息.物理内存大小可以通过sysctl调用轻松确定,而pid是微不足道的,但除了在ps或top上调用popen并解析输出之外,其余的调用都没有找到 - 这是不可接受的.任何帮助将不胜感激.
要求:
在g ++ 4.0上编译
没有obj-c
OSX 10.5
流程信息来自pidinfo
:
cristi:~ diciu$ grep proc_pidinfo /usr/include/libproc.h int proc_pidinfo(int pid, int flavor, uint64_t arg, void *buffer, int buffersize);
cpu负载来自host_statistics
:
cristi:~ diciu$ grep -r host_statistics /usr/include/ /usr/include/mach/host_info.h:/* host_statistics() */ /usr/include/mach/mach_host.defs:routine host_statistics( /usr/include/mach/mach_host.h:/* Routine host_statistics */ /usr/include/mach/mach_host.h:kern_return_t host_statistics
有关更多详细信息,请查看源代码,top
并且lsof
它们是开源的(您需要注册为Apple开发人员,但这是免费的):
https://opensource.apple.com/source/top/top-111.20.1/libtop.c.auto.html
稍后编辑:所有这些接口都是特定于版本的,因此在编写生产代码(libproc.h)时需要考虑到这一点:
/* * This header file contains private interfaces to obtain process information. * These interfaces are subject to change in future releases. */
既然你说没有Objective-C我们将排除大多数MacOS框架.
您可以使用getrusage()获得CPU时间,这可以为您的进程收取用户和系统CPU时间总量.要获得CPU百分比,您需要每秒对getrusage值进行一次快照(或者您想要的粒度).
#includestruct rusage r_usage; if (getrusage(RUSAGE_SELF, &r_usage)) { /* ... error handling ... */ } printf("Total User CPU = %ld.%ld\n", r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec); printf("Total System CPU = %ld.%ld\n", r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);
getrusage结构中有一个RSS字段,但在MacOS X 10.5中似乎总是为零.Michael Knight几年前写了一篇关于如何确定RSS的博客文章.