通过“top”命令在unix中通过单个进程计算Cpu百分比

时间:2010-12-15 14:31:19

标签: c++ c unix solaris

我想知道“top”命令如何计算任何进程使用的cpu百分比。

我试过在/ proc目录中读取“psinfo”二进制文件,但它没有帮助查找结果。

请提供任何有关如何完成的信息。

提前致谢。

1 个答案:

答案 0 :(得分:9)

top命令使用proc file system中的数据计算CPU使用率。包含CPU使用率数据的实际文件可能因平台而异。例如,在Linux中,它位于/proc/<pid>/stat中,而对于Solaris,可以在/proc/<pid>/psinfo中找到它。 CPU使用率计算为进程的累计CPU时间差除以更新之间测量的时间量。


对于Linux,您可以检查包含pstop的{​​{3}}来源以及procps中的其他处理工具。 http://procps.sourceforge.net文件特别包含检索数据的功能。


对于Solaris,您可以从readproc.c检查libproc来源。 https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc文件包含检索数据并将其存储在prog_get_info.c结构中的功能。


对于Linux,Solaris和其他人,您可以从psinfo_t检查Unix Top来源。 machine目录中特定于平台的源文件包含检索数据的功能。


<强>更新

用于检索进程的CPU时间的另一个选项(仅限Solaris)可能会传递到http://sourceforge.net/projects/unixtop系统调用的PIOCPSINFOPIOCSTATUS选项。 ioctl()选项在PIOCPSINFO结构中返回其他进程信息。 prpsinfo_t选项在PIOCSTATUS结构中返回进程的状态信息。

改编自prstatus_t的示例代码:

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);
}

注意:此代码未经测试,并且为了简单起见省略了错误检查。