【问题标题】:Getting CPU info from Process ID从进程 ID 获取 CPU 信息
【发布时间】:2011-03-31 03:12:17
【问题描述】:

如果有人可以帮助我,那就太好了:)

这似乎很难。从进程ID开始,我需要能够抓取:

  1. 进程占用了多少 CPU,以 % 为单位
  2. 进程使用 CPU 的时间

这需要用 Cocoa/Objective-C 或 C 编写。它还需要通过 Snow Leopard 在 Tiger 上工作。

谢谢!

【问题讨论】:

  • 你忘了写“请”。
  • 另外,请注意我的编辑(第一行)。

标签: objective-c c cocoa macos process


【解决方案1】:

一种粗略的方法是生成一个popen 命令并从ps 获取一些输出。

比如这样:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void get_process_info(int pid) {
  char ps_cmd[256];
  sprintf(ps_cmd, "ps -O %%cpu -p %d", pid); // see man page for ps
  FILE *fp = popen(ps_cmd, "r"); 
  if (fp) {
    char line[4096];
    while (line == fgets(line, 4096, fp)) {
      if (atoi(line) == pid) {
        char dummy[256];
        char cpu[256];
        char time[256];

        //   PID  %CPU   TT  STAT      TIME COMMAND
        // 32324   0,0 s001  S+     0:00.00 bc

        sscanf(line, "%s %s %s %s %s", dummy, cpu, dummy, dummy, time);
        printf("%s %s\n", cpu, time); // you will need to parse these strings

        pclose(fp);
        return;
      }
    }
    pclose(fp);
  }
}

int main() {
  get_process_info(32324);
  return 0;
}

【讨论】:

  • 这似乎计算有点慢。我将每秒针对机器上当前的所有进程运行它,这可能不够有效。我给了你努力的一票。至少你给了我一些东西:)
  • @Eric 如果您想获取所有流程的数据,可以轻松优化。让ps命令全部输出,同时解析。这将只有一个 popen 每秒调用一次。
  • 目前我每秒只为 Focus App 调用上述方法,但有时几秒钟过去了,没有返回值。这有意义吗?我如何优化代码以使其在至少一个进程上快速运行?非常感谢。顺便说一句,很棒的投资组合!
  • 谢谢。我还在这个问题的答案stackoverflow.com/questions/220323/… 中看到了一些其他解决方案的提示
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2023-03-03
  • 2012-10-02
  • 2011-09-05
  • 2013-03-06
相关资源
最近更新 更多