2009-08-13 57 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; 
}