监控进程使用内存 getrusage 函数简介及使用

来源:互联网 发布:中国软件学院排名 编辑:程序博客网 时间:2024/06/03 17:22

用这种方法可以判断程序是否有内存泄露情况



#include <sys/types.h>

#include <sys/time.h>
#include <sys/resource.h>
  
#define   RUSAGE_SELF     0
#define   RUSAGE_CHILDREN     -1
  
int   getrusage(int who, struct rusage *rusage);


getrusage函数有两个参数。第一个参数可以设置为RUSAGE_SELF或者RUSAGE_CHILDREN。如果设置成 RUSAGE_SELF,那么将会以当前进程的相关信息来填充rusage(数据)结构。反之,如果设置成RUSAGE_CHILDREN,那么 rusage结构中的数据都将是当前进程的子进程的信息。

rusage(数据)结构定义在/usr/include/sys/resource.h中。它含有以下成员变量:

struct   rusage {
      struct timeval ru_utime;   /* user time used */
      struct timeval ru_stime;   /* system time used */
      long  ru_maxrss;           /* max resident set size */
      long  ru_ixrss;            /* integral shared memory size */
      long  ru_idrss;            /* integral unshared data */
      long  ru_isrss;            /* integral unshared stack */
      long  ru_minflt;           /* page reclaims */
      long  ru_majflt;           /* page faults */
      long  ru_nswap;            /* swaps */
      long  ru_inblock;          /* block input operations */
      long  ru_oublock;          /* block output operations */
      long  ru_msgsnd;           /* messages sent */
      long  ru_msgrcv;           /* messages received */
      long  ru_nsignals;         /* signals received */
      long  ru_nvcsw;            /* voluntary context switches */
      long  ru_nivcsw;           /* involuntary " */
  };
示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
int
main(int argc, char **argv)
{

    struct rusage buf;

    
    if(argc == 2) {
      system(argv[1]);
    }else {
      fprintf(stderr,"./getrusage  /"ls -l >/dev/null/"/n");
      exit(0);
    }
    int err = getrusage(RUSAGE_CHILDREN, &buf);
    //int err = getrusage(RUSAGE_SELF, &buf);
    printf("ERR=%d/n", err);
    printf("%20s:%ld/%ld/t%s/n", "ru_utime", 
       buf.ru_utime.tv_sec, buf.ru_utime.tv_usec,
       "user time used (secs/usecs)");
    printf("%20s:%ld/%ld/t%s/n", "ru_stime", 
       buf.ru_stime.tv_sec, 
       buf.ru_stime.tv_usec,
       "system time used (secs/usecs)");
    printf("%20s:%-10ld/t%s/n", 
       "ru_maxrss",
       buf.ru_maxrss,
       "maximum resident set size");
    printf("%20s:%-10ld/t%s/n",
       "ru_ixrss", 
       buf.ru_ixrss,
       "integral shared memory size");
    printf("%20s:%-10ld/t%s/n", 
       "ru_idrss",
       buf.ru_idrss,
       "integral unshared data size");
    printf("%20s:%-10ld/t%s/n", 
       "ru_isrss",
       buf.ru_isrss,
       "integral unshared data stack size");
    printf("%20s:%-10ld/t%s/n", 
       "ru_minflt",
       buf.ru_minflt,
       "page reclaims");
    printf("%20s:%-10ld/t%s/n",
       "ru_majflt",
       buf.ru_majflt,
       "page faults");
    printf("%20s:%-10ld/t%s/n",
       "ru_nswap",
       buf.ru_nswap,
       "swaps");
    printf("%20s:%-10ld/t%s/n",
       "ru_inblock",
       buf.ru_inblock,
       "block input operations");
    printf("%20s:%-10ld/t%s/n",
       "ru_oublock",
       buf.ru_oublock,
       "block output operations");
    printf("%20s:%-10ld/t%s/n",
       "ru_msgsnd",
       buf.ru_msgsnd,
       "messages sent");
    printf("%20s:%-10ld/t%s/n",
       "ru_msgrcv",
       buf.ru_msgrcv,
       "messages received");
    printf("%20s:%-10ld/t%s/n",
       "ru_nsignals",
       buf.ru_nsignals,
       "signals received");
    printf("%20s:%-10ld/t%s/n",
       "ru_nvcsw",
       buf.ru_nvcsw,
       "voluntary context switches");
    printf("%20s:%-10ld/t%s/n",
       "ru_nivcsw",
       buf.ru_nivcsw,
       "involuntary context switches");
  exit(0);
}
0 0
原创粉丝点击