免费注册 查看新帖 |

Chinaunix

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

[函数] 根据进程名,怎么调用系统函数来获取该进程的内存量? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-13 08:58 |只看该作者 |倒序浏览
在solaris下,知道进程的名称,怎么调用相关系统函数来获取该进程的内存占用信息?
得到的信息要类似ps的结果。
当然如果能得到该进程的CPU占有率,线程数等更好!

希望能给出一个具体的例子代码,谢谢!

论坛徽章:
0
2 [报告]
发表于 2003-08-13 09:50 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

因为进程的信息都在/proc/进程id名,每个进程对应一个文件,所以从此文件中可以获得cpu和内存的信息

论坛徽章:
0
3 [报告]
发表于 2003-08-13 09:55 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

sprintf(procfilename,"/proc/%05d",pid);  //pid为进程的id

fp = open(procfilename,O_RDONLY);
if ( fp != -1) {

  sts = ioctl(fp,PIOCPSINFO,&psinfo);//prpsinfo_t       psinfo;
  if(sts != -1) {

     占有的cpu=psinfo.pr_cpu

     memsize = psinfo.pr_rssize * 8;
     memsize = memsize; /* 8192/1024; */
     memsize = psinfo.pr_size * 8;
     vmemsize= memsize;  /*mempagesize/1024;
  }
}

论坛徽章:
0
4 [报告]
发表于 2003-08-13 11:54 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

to yuxq:
谢谢你的回复。
还有一个问题,怎么从进程名获取到进程ID。因为程序与那些进程不是同一个进程,应该可以通过某个API直接可以获取,还要请教!
再次感谢!

论坛徽章:
0
5 [报告]
发表于 2003-08-13 13:05 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

如果是C程序,应该没有这个API,因为多个进程可能拥有同一个进程名(多进程程序),如果想获得,可以用SHELL脚本来获取,呵呵

论坛徽章:
0
6 [报告]
发表于 2003-08-13 14:17 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

没有这个API?
我对solaris不熟,但是系统应该有提供遍历进程树的接口API呀。
即使多个进程同名,就都返回回来,或者提供一个回调接口。

希望哪位大侠能够指点。

论坛徽章:
0
7 [报告]
发表于 2003-08-13 14:52 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

to yuxq:
  prpsinfo_t psinfo
  是包含在哪个头文件中的?我怎么找不到?

  对了,你确定solaris中有这个结构?
  谢谢。

论坛徽章:
0
8 [报告]
发表于 2003-08-13 15:01 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

在/usr/include/sys/procfs.h

论坛徽章:
0
9 [报告]
发表于 2003-08-13 15:14 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

这是一种实现的方法,也就是将/proc下的所有文件遍历一变,判断当中的哪个进程名与已知的进程名相同,然后可以取得对应的id,具体请参考一下代码
  
dir = opendir("/proc";

  while(1) {

      dir_content = readdir(dir);
      if(dir_content == NULL)
         break;

#ifndef SUN
      if( dir_content->;d_namlen != PROC_PID_LEN )
         continue;
      sprintf(procfilename,"/proc/%s",dir_content->;d_name);
#else
      sprintf(procfilename,"/proc/%s/psinfo",dir_content->;d_name);

#endif

      fp = open(procfilename,O_RDONLY);
      if ( fp != -1) {

         sts = ioctl(fp,PIOCPSINFO,&psinfo);
         if(sts != -1) {
            sts = strcmp(procName,psinfo.pr_fname);
            if( (sts == 0) && (psinfo.pr_pid != self_pid) ) {
               found = 1;
               break;
            }
         }
         else return(1);
      }
      else
         return(1);
  }

论坛徽章:
0
10 [报告]
发表于 2003-08-13 15:17 |只看该作者

根据进程名,怎么调用系统函数来获取该进程的内存量?

/usr/include/sys/procfs.h 中关于prpsinfo_t 的定义
    struct prpsinfo {
        char    pr_state;               /* task/thread state */
        char    pr_sname;               /* pr_state in printable char form */
        char    pr_zomb;                /* task/thread terminated but not waited
                                           for */
        char    pr_nice;                /* nice value */
        u_long  pr_flag;                /* process flags */
        uid_t   pr_uid;                 /* user id */
        gid_t   pr_gid;                 /* group id */
        pid_t   pr_pid;                 /* process id */
        pid_t   pr_ppid;                /* parent process id */
        pid_t   pr_pgrp;                /* process group leader pid */
        pid_t   pr_sid;                 /* session id */
        caddr_t pr_addr;                /* physical address */
        long    pr_size;                /* image size in pages */
        long    pr_rssize;              /* resident set size in pages */
        caddr_t pr_wchan;               /* sleeping task/thread wait address */
        timestruc_t pr_start;           /* start time */
        timestruc_t pr_time;            /* usr+sys cpu time */
        long    pr_pri;                 /* task/thread priority */
        char    pr_oldpri;              /* old task/thread priority; pre-SVR4 */
        char    pr_cpu;                 /* cpu usage; pre-SVR4 */
        dev_t   pr_ttydev;              /* controlling tty dev(PRNODEV if none*/
        char    pr_clname[CLNAME_SZ];   /* scheduling class name */
        char    pr_fname[FNAME_SZ];     /* last part of exec'd path name */
        char    pr_psargs[PSARGS_SZ];   /* arg list initial characters */
        int     pr_onpro;       /* processor on which it is running */
        int     pr_bindpro;     /* processor on which it is bound */
        int     pr_bindpset;    /* processor-set on which it is bound */
        int     pr_exbindpset;  /* processor-set on which it is exbound */
        long    pr_filler[18];          /* for future use */
};
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP