⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory_freebsd.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
字号:
#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <net-snmp/agent/auto_nlist.h>#include <net-snmp/agent/hardware/memory.h>#include <unistd.h>#include <sys/param.h>#include <sys/fcntl.h>#include <sys/sysctl.h>#include <sys/vmmeter.h>#include <kvm.h>#if HAVE_SYS_VMPARAM_H#include <sys/vmparam.h>#else#include <vm/vm_param.h>#endif#define SUM_SYMBOL       "cnt"#define BUFSPACE_SYMBOL  "bufspace"quad_t    swapTotal;quad_t    swapUsed;quad_t    swapFree;int swapmode(long);    /*     * Load the latest memory usage statistics     */int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {    netsnmp_memory_info *mem;    long           pagesize;    int            nswap;    struct vmmeter vmem;    struct vmtotal total;    size_t         total_size  = sizeof(total);    int            total_mib[] = { CTL_VM, VM_METER };    u_long         phys_mem;    u_long         user_mem;    size_t         mem_size  = sizeof(phys_mem);    int            phys_mem_mib[] = { CTL_HW, HW_PHYSMEM };    int            user_mem_mib[] = { CTL_HW, HW_USERMEM };    /*     * Retrieve the memory information from the underlying O/S...     */    sysctl(total_mib,    2, &total,    &total_size,    NULL, 0);    sysctl(phys_mem_mib, 2, &phys_mem, &mem_size,      NULL, 0);    sysctl(user_mem_mib, 2, &user_mem, &mem_size,      NULL, 0);    auto_nlist(SUM_SYMBOL,      (char *) &vmem,     sizeof(vmem));#ifndef freebsd4    pagesize = 1024;#else    pagesize = getpagesize();#endif    /*     * ... and save this in a standard form.     */    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 1 );    if (!mem) {        snmp_log_perror("No Physical Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Physical memory");        mem->units = pagesize;        mem->size  = user_mem/pagesize;        mem->free  = total.t_free;    }    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_USERMEM, 1 );    if (!mem) {        snmp_log_perror("No (user) Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Real memory");        mem->units = pagesize;        mem->size  = total.t_rm;        mem->free  = total.t_arm;    }    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_VIRTMEM, 1 );    if (!mem) {        snmp_log_perror("No Virtual Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Virtual memory");        mem->units = pagesize;        mem->size  = total.t_vm;        mem->free  = total.t_avm;    }    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 1 );    if (!mem) {        snmp_log_perror("No Shared Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Shared virtual memory");        mem->units = pagesize;        mem->size  = total.t_vmshr;        mem->free  = total.t_avmshr;    }    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED2, 1 );    if (!mem) {        snmp_log_perror("No Shared2 Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Shared real memory");        mem->units = pagesize;        mem->size  = total.t_rmshr;        mem->free  = total.t_armshr;    }    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 1 );    if (!mem) {        snmp_log_perror("No Cached Memory info entry");    } else {        if (!mem->descr)             mem->descr = strdup("Cached memory");        mem->units = vmem.v_page_size;        mem->size  = vmem.v_cache_count;        mem->free  = -1;    }    nswap = swapmode(pagesize);    mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 1 );    if (!mem) {        snmp_log_perror("No Swap info entry");    } else {        if (!mem->descr)             mem->descr = strdup( (nswap>1) ? "Swap space (total)"                                            : "Swap space");        mem->units = pagesize;        mem->size  = swapTotal;        mem->free  = swapFree;    }    return 0;}/* * Retained from UCD implementation */#ifndef freebsd4/* * Executes swapinfo and parses last line  * This is just way too ugly ;)  */intswapmode(long pagesize){    struct extensible ext;    int             fd;    FILE           *file;    strcpy(ext.command, "/usr/sbin/swapinfo -k");    if ((fd = get_exec_output(&ext)) != -1) {        file = fdopen(fd, "r");        while (fgets(ext.output, sizeof(ext.output), file) != NULL);        fclose(file);        wait_on_exec(&ext);        sscanf(ext.output, "%*s%*d%qd%qd", &swapUsed, &swapFree);        swapTotal = swapUsed + swapFree;    }    return 1;}#else/* * swapmode is based on a program called swapinfo written * by Kevin Lahey <kml@rokkaku.atl.ga.us>. */#include <sys/conf.h>intswapmode(long pagesize){    int             i, n;    static kvm_t   *kd = NULL;    struct kvm_swap kswap[16];    netsnmp_memory_info *mem;    char buf[1024];    if (kd == NULL)        kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL);    n = kvm_getswapinfo(kd, kswap, sizeof(kswap) / sizeof(kswap[0]), 0);    swapUsed = swapTotal = swapFree = 0;    if ( n > 1 ) {        /*         * If there are multiple swap devices, then record         *   the statistics for each one separately...         */        for (i = 0; i < n; ++i) {            mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP+1+i, 1 );            if (!mem)                continue;            if (!mem->descr) {                sprintf(buf, "swap %s", kswap[i].ksw_devname);                mem->descr = strdup( buf );            }            mem->units = pagesize;            mem->size  = kswap[i].ksw_total;            mem->free  = kswap[i].ksw_total - kswap[i].ksw_used;            /*             *  ... and keep a running total for the overall swap stats             */            swapTotal += kswap[i].ksw_total;            swapUsed  += kswap[i].ksw_used;        }    } else {        /*         * If there's only one swap device, then don't bother         *   with individual statistics.         */        swapTotal += kswap[0].ksw_total;        swapUsed  += kswap[0].ksw_used;    }    swapFree = swapTotal - swapUsed;    return n;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -