📄 memory.c
字号:
#include <config.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#if HAVE_FCNTL_H#include <fcntl.h>#endif#include <ctype.h>#include <signal.h>#if HAVE_MACHINE_PARAM_H#include <machine/param.h>#endif#if HAVE_SYS_VMMETER_H#if !defined(bsdi2) && !defined(netbsd1)#include <sys/vmmeter.h>#endif#endif#if HAVE_SYS_CONF_H#include <sys/conf.h>#endif#if HAVE_ASM_PAGE_H#include <asm/page.h>#endif#if HAVE_SYS_SWAP_H#include <sys/swap.h>#endif#if HAVE_SYS_FS_H#include <sys/fs.h>#else#if HAVE_UFS_FS_H#include <ufs/fs.h>#else#ifdef HAVE_SYS_STAT_H#include <sys/stat.h>#endif#ifdef HAVE_SYS_VNODE_H#include <sys/vnode.h>#endif#ifdef HAVE_UFS_UFS_QUOTA_H#include <ufs/ufs/quota.h>#endif#ifdef HAVE_UFS_UFS_INODE_H#include <ufs/ufs/inode.h>#endif#ifdef HAVE_SYS_PARAM_H#include <sys/param.h>#endif#if HAVE_UFS_FFS_FS_H#include <ufs/ffs/fs.h>#endif#endif#endif#if HAVE_MTAB_H#include <mtab.h>#endif#include <sys/stat.h>#include <errno.h>#if HAVE_FSTAB_H#include <fstab.h>#endif#if HAVE_SYS_STATVFS_H#include <sys/statvfs.h>#endif#if HAVE_SYS_VFS_H#include <sys/vfs.h>#endif#if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS)#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#if HAVE_SYS_MOUNT_H#include <sys/mount.h>#endif#if HAVE_SYS_SYSCTL_H#include <sys/sysctl.h>#endif#define statvfs statfs#endif#if HAVE_VM_SWAP_PAGER_H#include <vm/swap_pager.h>#endif#if HAVE_SYS_FIXPOINT_H#include <sys/fixpoint.h>#endif#if HAVE_MALLOC_H#include <malloc.h>#endif#if HAVE_STRING_H#include <string.h>#endif#if TIME_WITH_SYS_TIME# include <sys/time.h># include <time.h>#else# if HAVE_SYS_TIME_H# include <sys/time.h># else# include <time.h># endif#endif#if defined(hpux10) || defined(hpux11)#include <sys/pstat.h>#endif#include "mibincl.h"#include "mibdefs.h"#include "struct.h"#include "util_funcs.h"#include "memory.h"#include "auto_nlist.h"#include "read_config.h"#include "agent_read_config.h"int minimumswap;#ifndef linuxstatic int pageshift; /* log base 2 of the pagesize */#endif#ifndef bsdi2#ifdef NSWAPDEV_SYMBOLint nswapdev=10; /* taken from <machine/space.h> */#endif#ifdef NSWAPFS_SYMBOLint nswapfs=10; /* taken from <machine/space.h> */#endif#endif /* !bsdi2 */#define DEFAULTMINIMUMSWAP 16000 /* kilobytes */static FindVarMethod var_extensible_mem;void init_memory(void){#ifndef linux int pagesize;#ifdef PHYSMEM_SYMBOL auto_nlist(PHYSMEM_SYMBOL,0,0);#endif#ifdef TOTAL_MEMORY_SYMBOL auto_nlist(TOTAL_MEMORY_SYMBOL,0,0);#endif#ifdef MBSTAT_SYMBOL auto_nlist(MBSTAT_SYMBOL,0,0);#endif#ifdef SWDEVT_SYMBOL auto_nlist(SWDEVT_SYMBOL,0,0);#endif#ifdef FSWDEVT_SYMBOL auto_nlist(FSWDEVT_SYMBOL,0,0);#endif#ifdef NSWAPFS_SYMBOL auto_nlist(NSWAPFS_SYMBOL,0,0);#endif#ifdef NSWAPDEV_SYMBOL auto_nlist(NSWAPDEV_SYMBOL,0,0);#endif#ifndef bsdi2#ifdef NSWAPDEV_SYMBOL if (auto_nlist(NSWAPDEV_SYMBOL,(char *) &nswapdev, sizeof(nswapdev)) == 0) return;#endif#ifdef NSWAPFS_SYMBOL if (auto_nlist(NSWAPFS_SYMBOL,(char *) &nswapfs, sizeof(nswapfs)) == 0) return;#endif#endif pagesize = 1 << PGSHIFT; pageshift = 0; while (pagesize > 1) { pageshift++; pagesize >>= 1; } pageshift -= 10;#endif { struct variable2 extensible_mem_variables[] = { {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem,1,{MIBINDEX}}, {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORNAME }}, {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALSWAP}}, {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMAVAILSWAP}}, {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALREAL}}, {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMAVAILREAL}}, {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALSWAPTXT}}, {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMUSEDSWAPTXT}}, {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALREALTXT}}, {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMUSEDREALTXT}}, {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALFREE}}, {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMSWAPMINIMUM}}, {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMSHARED}}, {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMBUFFER}}, {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMCACHED}}, {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1, {ERRORFLAG }}, {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG }} };/* Define the OID pointer to the top of the mib tree that we're registering underneath */ oid mem_variables_oid[] = { EXTENSIBLEMIB,MEMMIBNUM }; /* register ourselves with the agent to handle our mib tree */ REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2, \ mem_variables_oid); snmpd_register_config_handler("swap", memory_parse_config, memory_free_config,"min-avail"); }}void memory_parse_config(const char *token, char *cptr){ minimumswap = atoi(cptr);}void memory_free_config (void) { minimumswap = DEFAULTMINIMUMSWAP;}#ifdef linuxenum meminfo_row { meminfo_main = 0, meminfo_swap };enum meminfo_col { meminfo_total = 0, meminfo_used, meminfo_free, meminfo_shared, meminfo_buffers, meminfo_cached};#define MEMINFO_FILE "/proc/meminfo"static char buf[300];/* This macro opens FILE only if necessary and seeks to 0 so that successive calls to the functions are more efficient. It also reads the current contents of the file into the global buf.*/#define FILE_TO_BUF(FILE) { \ static int n, fd = -1; \ if (fd == -1 && (fd = open(FILE, O_RDONLY)) == -1) { \ return 0; \ } \ lseek(fd, 0L, SEEK_SET); \ if ((n = read(fd, buf, sizeof buf - 1)) < 0) { \ close(fd); \ fd = -1; \ return 0; \ } \ buf[n] = '\0'; \}#define MAX_ROW 3 /* these are a little liberal for flexibility */#define MAX_COL 7unsigned** meminfo(void) { static unsigned *row[MAX_ROW + 1]; /* row pointers */ static unsigned num[MAX_ROW * MAX_COL]; /* number storage */ char *p; int i, j, k, l; unsigned long m; FILE_TO_BUF(MEMINFO_FILE) if (!row[0]) /* init ptrs 1st time through */ for (i=0; i < MAX_ROW; i++) /* std column major order: */ row[i] = num + MAX_COL*i; /* A[i][j] = A + COLS*i + j */ p = buf; for (i=0; i < MAX_ROW; i++) /* zero unassigned fields */ for (j=0; j < MAX_COL; j++) row[i][j] = 0; for (i=0; i < MAX_ROW && *p; i++) { /* loop over rows */ while(*p && !isdigit(*p)) p++; /* skip chars until a digit */ for (j=0; j < MAX_COL && *p; j++) { /* scanf column-by-column */ l = sscanf(p, "%u%n", &m, &k); m /= 1024; if (0x7fffffff < m) { *(row[i] + j) = 0x7fffffff; } else { *(row[i] + j) = (unsigned) m; } p += k; /* step over used buffer */ if (*p == '\n' || l < 1) /* end of line/buffer */ break; } }/* row[i+1] = NULL; terminate the row list, currently unnecessary */ return row; /* NULL return ==> error */}unsigned memory(int iindex){ unsigned **mem = meminfo(); if (mem != NULL) return mem[meminfo_main][iindex]; else return -1;}unsigned memswap(int iindex){ unsigned **mem = meminfo(); if (mem != NULL) return mem[meminfo_swap][iindex]; else return -1;}#else#define pagetok(size) ((size) << pageshift)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -