免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4897 | 回复: 3
打印 上一主题 下一主题

Unix操作系统上如何编程获取进程的内存、CPU利用状况? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-10 16:04 |只看该作者 |倒序浏览
Unix操作系统上如何编程获取进程的内存、CPU利用状况 ?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-03-11 12:02 |只看该作者

Unix操作系统上如何编程获取进程的内存、CPU利用状况?

读写proc文件系统即可

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2003-03-12 00:21 |只看该作者

Unix操作系统上如何编程获取进程的内存、CPU利用状况?

进程的存储信息可用下面的函数调用查看,如果你的系统有着个系统调用的话。
int getrusage(int who, struct rusage *r_usage);
读取进程表的程序如下。可以参考一下
SUNOS 版本
#define _KMEMUSER
     #include <sys/proc.h>;
     #include <kvm.h>;
     #include <fcntl.h>;
   
     char regexpstr[256];
     #define INIT            register char *sp=regexpstr;
     #define GETC()          (*sp++)
     #define PEEKC()         (*sp)
     #define UNGETC(c)       (--sp)
     #define RETURN(pointer) return(pointer);
     #define ERROR(val)
     #include <regexp.h>;
   
     pid_t
     getpidbyname(char *name,pid_t skipit)
     {
         kvm_t *kd;
         char **arg;
         int error;
         char *p_name=NULL;
         char expbuf[256];
         char **freeme;
         int curpid;
         struct user * cur_user;
         struct user myuser;
         struct proc * cur_proc;
   
   
         if((kd=kvm_open(NULL,NULL,NULL,O_RDONLY,NULL))==NULL){
             return(-1);
         }
         sprintf(regexpstr,"^.*/%s$",name);
         compile(NULL,expbuf,expbuf+256,'\0');
   
         while(cur_proc=kvm_nextproc(kd)){
             curpid = cur_proc->;p_pid;
             if((cur_user=kvm_getu(kd,cur_proc))!=NULL){
                 error=kvm_getcmd(kd,cur_proc,cur_user,&amp;arg,NULL);
                 if(error==-1){
                     if(cur_user->;u_comm[0]!='\0'){
                         p_name=cur_user->;u_comm;
                     }
                 }
                 else{
                     p_name=arg[0];
                 }
             }
             if(p_name){
                 if(!strcmp(p_name,name)){
                     if(error!=-1){
                         free(arg);
                     }
                     if(skipit!=-1 &amp;&amp; ourretval==skipit){
                         ourretval=-1;
                     }
                     else{
                         close(fd);
                         break;
                     }
                     break;
                 }
                 else{
                     if(step(p_name,expbuf)){
                         if(error!=-1){
                             free(arg);
                         }
                         break;
                     }
                 }
             }
             if(error!=-1){
                 free(arg);
             }
             p_name=NULL;
         }
         kvm_close(kd);
         if(p_name!=NULL){
             return(curpid);
         }
         return (-1);
     }
SYSV版本
pid_t
     getpidbyname(char *name,pid_t skipit)
     {
         DIR  *dp;
         struct dirent *dirp;
         prpsinfo_t retval;
         int fd;
         pid_t ourretval=-1;
   
         if((dp=opendir("/proc")==NULL){
             return -1;
         }
         chdir("/proc";
         while((dirp=readdir(dp))!=NULL){
             if(dirp->;d_name[0]!='.'){
                 if((fd=open(dirp->;d_name,O_RDONLY))!=-1){
                     if(ioctl(fd,PIOCPSINFO,&amp;retval)!=-1){
                         if(!strcmp(retval.pr_fname,name)){
                             ourretval=(pid_t)atoi(dirp->;d_name);
                             if(skipit!=-1 &amp;&amp; ourretval==skipit){
                                 ourretval=-1;
                             }
                             else{
                                 close(fd);
                                 break;
                             }
                         }
                     }
                     close(fd);
                 }
             }
         }
         closedir(dp);
         return ourretval;
     }
AIX版本
#include <stdio.h>;
     #include <procinfo.h>;
   
     int getprocs(struct procsinfo *, int, struct fdsinfo *,
                  int, pid_t *, int);
   
     pid_t getpidbyname(char *name, pid_t *nextPid)
     {
       struct procsinfo  pi;
       pid_t             retval = (pid_t) -1;
       pid_t             pid;
   
       pid = *nextPid;
   
       while(1)
       {
         if(getprocs(&amp;pi, sizeof pi, 0, 0, &amp;pid, 1) != 1)
           break;
   
         if(!strcmp(name, pi.pi_comm))
         {
           retval = pi.pi_pid;
           *nextPid = pid;
           break;
         }
       }
   
       return retval;
     }
   
     int main(int argc, char *argv[])
     {
       int   curArg;
       pid_t pid;
       pid_t nextPid;
   
       if(argc == 1)
       {
         printf("syntax: %s <program>; [program ...]\n",argv[0]);
         exit(1);
       }
   
       for(curArg = 1; curArg < argc; curArg++)
       {
         printf("rocess IDs for %s\n", argv[curArg]);
   
         for(nextPid = 0, pid = 0; pid != -1; )
           if((pid = getpidbyname(argv[curArg], &amp;nextPid)) != -1)
             printf("\t%d\n", pid);
       }
     }

论坛徽章:
0
4 [报告]
发表于 2003-03-17 23:44 |只看该作者

Unix操作系统上如何编程获取进程的内存、CPU利用状况?

很好!

大家自己开发这种监控应用多吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP