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

Aru*_*nmu 5 c c++ unix solaris

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

我试过在/ proc目录中读取"psinfo"二进制文件,但它没有帮助找到结果.

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

提前致谢.

jsc*_*ier 9

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)可能是传递给系统调用的PIOCPSINFOPIOCSTATUS选项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)

注意:此代码未经测试,省略了错误检查以简化操作.