2010-08-17 133 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