2010-08-17 134 views
4

如果任何人都可以帮助我,那将是巨大的:)获取CPU信息

这似乎是一个艰难的一个。从过程ID开始,我需要能够抓住:

  1. 占用多少CPU的过程是在%占用
  2. 进程已经使用CPU

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

谢谢!

+2

你忘了写上 “请”。 – Eimantas 2010-08-17 17:43:13

+0

另外,请注意我的编辑(第一行)。 – 2010-08-17 17:59:40

回答

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; 
} 
+0

这似乎计算有点慢。我将每秒钟对机器上当前的所有进程执行此操作,这可能不够高效。尽管我给了你一个投票。至少你给了我一些东西:) – 2010-08-18 08:38:24

+1

@Eric如果你想获得所有进程的数据,可以很容易地进行优化。让'ps'命令输出全部并且同时解析它们。这只会是每秒钟一次“popen”呼叫。 – epatel 2010-08-18 09:06:02

+0

目前,我每秒钟都会为Focus应用程序调用上述方法,但有时候几秒钟内没有返回值。这有意义吗?我怎样才能优化代码,以便在至少一个进程中快速运行? 非常感谢。 Btw伟大的投资组合! – 2010-08-18 09:41:02