2009-08-13 92 views
0

獲取CPU使用情況統計信息由C在Solaris 10上,並在C,我想定期查詢號碼,如在Solaris 10

  • 對於OS進程中的特定LWP的CPU使用率。
  • 該OS進程的內存使用情況。

我已經知道如何通過打開/ proc/pid/psinfo和讀取它(pr_rssize)來完成後者,但有沒有一種方法來實現前者?

在過去,我分叉了一個prstat的副本,從中解析出輸出並將其讀回到我的C代碼中。由於我正在查詢越來越多的這類信息,這變得越來越乏味,而且感覺很明顯是錯誤的。肯定有一種方法可以用一些簡單的C代碼來做到這一點。

感謝您的任何幫助。 NickB

回答

1

在Solaris,可以通過讀取/proc/PID/lwp/LWPID/lwpsinfo獲得特定LWP-ps信息。此文件包含一個lwpsinfo結構,其中包括:

timestruc_t pr_time;  /* cpu time for this lwp */ 

瞭解更多詳細信息,請參閱proc(4)

+0

很好地工作。在lwpsinfo中也使用pr_pctcpu。 – NickB 2009-08-21 09:56:59

0

當你問一個C的解決方案,也許你可以看看perl模塊Solaris::Procfs看看它是如何提取信息?

0

#include <stdio.h> 
#include <dirent.h> 
#include <procfs.h> 

int psinfo_thread_info(pid_t pid) 
{ 
    int i, nent, nread = 0; 
    size_t entsz; 

    FILE *fp = NULL; 
    char file_name[128] = {0,}; 
    char *ptr, *buf; 
    prheader_t header; 
    lwpsinfo_t *lwpsinfo; 

    snprintf(file_name, sizeof(file_name), "/proc/%ld/lpsinfo", pid); 
    if ((fp = fopen(file_name, "r")) == NULL) { 
     return -1; 
    } 

    nread = fread(&header, sizeof(prheader_t), 1, fp); 
    if (nread < 0) { 
     fclose(fp); 
     return -1; 
    } 

    nent = header.pr_nent; 
    printf(" Thread_num: %d\n", nent); 

    entsz = header.pr_entsize * nent; 
    ptr = buf = malloc(entsz); 
    if (pread(fileno(fp), buf, entsz, sizeof (struct prheader)) != entsz) { 
     free(ptr); 
     free(buf); 
     fclose(fp); 
     return -1; 
    } 
    fclose(fp); 

    for (i = 0; i < nent; i++, ptr += header.pr_entsize) 
    { 
     lwpsinfo = (lwpsinfo_t *)ptr; 
     if (lwpsinfo == NULL) { 
      continue; 
     } 
     printf("[%2d thread] cpu_usage = %.2lf%%\n", 
       lwpsinfo->pr_lwpid, 
       ((double)(lwpsinfo->pr_pctcpu * 100.0)/0x8000)); 
    } 
    free(ptr); 
    free(buf); 
    return 0; 
} 

int main(void) 
{ 
    FILE *fp = NULL; 
    DIR *proc_dir = NULL; 
    struct dirent *dir_entry = NULL; 
    int nread = 0; 
    char file_name[128] = {0,}; 
    psinfo_t pinfo; 

    if ((proc_dir = opendir("/proc")) == NULL) { 
     printf("opendir failed\n"); 
     return -1; 
    } 

    while ((dir_entry = readdir(proc_dir)) != NULL) 
    { 
     if (atoi(dir_entry->d_name) == 0) { 
      continue; 
     } 
     snprintf(file_name, sizeof(file_name), "/proc/%s/psinfo", 
       dir_entry->d_name); 

     if ((fp = fopen(file_name, "r")) == NULL) { 
      continue; 
     } 

     nread = fread(&pinfo, sizeof(pinfo), 1, fp); 
     if (nread < 0) { 
      fclose(fp); 
      continue; 
     } 
     fclose(fp); 

     printf("---------------------------\n"); 
     printf("\nPROC:%s PID:%ld, CPU_USAGE:%.2lf%% ", 
       pinfo.pr_fname, pinfo.pr_pid, 
       ((double)(pinfo.pr_pctcpu * 100.0)/0x8000)); 

     psinfo_thread_info(pinfo.pr_pid); 
    } 
    closedir(proc_dir); 

    return 0; 
}