我想知道“顶部”命令如何计算任何进程使用的CPU百分比。
我已经尝试读取/ proc目录中的“psinfo”二进制文件,但它没有帮助find结果。
请提供任何信息如何完成。
提前致谢。
top
命令使用proc文件系统中的数据计算CPU使用率。 包含CPU使用率数据的实际文件可能因平台而异。 例如,在Linux中可以在/proc/<pid>/stat
中找到它,对于Solaris它可以在/proc/<pid>/psinfo
。 CPU使用率是根据进程累积CPU时间的差异除以更新之间测得的时间量来计算的。
对于Linux,您可以从http://procps.sourceforge.net检查包含ps
, top
和其他处理工具的procps源代码。 readproc.c文件特别包含检索数据的功能。
对于Solaris,您可以从https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc检查libproc源代码。 prog_get_info.c文件包含用于检索数据并将其存储在psinfo_t
结构中的功能。
对于Linux,Solaris等,您可以从http://sourceforge.net/projects/unixtop查看Unix Top源代码。 machine
目录内特定于平台的源文件包含检索数据的功能。
更新
用于检索进程的CPU时间的另一个选项(仅限Solaris)可能会传递到PIOCPSINFO
或PIOCSTATUS
选项以进行ioctl()
系统调用。 PIOCPSINFO
选项返回prpsinfo_t
结构中的其他进程信息。 PIOCSTATUS
选项在prstatus_t
结构中返回进程的状态信息。
根据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); }
注意:此代码未经测试,为简单起见,省略错误检查。