该top命令使用proc文件系统中的数据计算CPU使用率.包含CPU使用率数据的实际文件可能因平台而异.例如,在Linux中可以找到它,也可以在/proc/<pid>/statSolaris中找到它/proc/<pid>/psinfo.CPU使用率计算为进程的累计CPU时间差除以更新之间测量的时间量.
对于Linux,你可以检查procps的源,其中包括ps,top从和其他处理工具http://procps.sourceforge.net.该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);
}
Run Code Online (Sandbox Code Playgroud)
注意:此代码未经测试,省略了错误检查以简化操作.