gpt4 book ai didi

c++ - unix下单进程 "top"命令计算Cpu百分比

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:58 26 4
gpt4 key购买 nike

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

我已经尝试读取/proc 目录中的“psinfo”二进制文件,但它对找到结果没有帮助。

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

提前致谢。

最佳答案

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


对于 Linux,您可以检查 procps来源包括ps , top ,以及来自 http://procps.sourceforge.net 的其他工艺工具. readproc.c文件特别包含检索数据的功能。


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


对于 Linux、Solaris 和其他系统,您可以检查 Unix Top来源自http://sourceforge.net/projects/unixtop . 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);
}

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

关于c++ - unix下单进程 "top"命令计算Cpu百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com