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

📄 vmstat_linux.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <net-snmp/net-snmp-config.h>#if HAVE_LIMITS_H#include <limits.h>#endif#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_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#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>#else#include <strings.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#include <sys/utsname.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/cpu.h>#include "mibdefs.h"#include "struct.h"#include "util_funcs.h"#include "vmstat.h"FindVarMethod var_extensible_vmstat;static int has_vmstat = 1;static int has_cpu_26 = 1;static time_t cache_time;#define CACHE_TIMEOUT	5#define STAT_FILE	"/proc/stat"#define VMSTAT_FILE	"/proc/vmstat"voidinit_vmstat(void){    struct variable2 extensible_vmstat_variables[] = {        {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,         {MIBINDEX}},        {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1,         {ERRORNAME}},        {SWAPIN, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPIN}},        {SWAPOUT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPOUT}},        {RAWSWAPIN, ASN_COUNTER, RONLY, var_extensible_vmstat, 1, {RAWSWAPIN}},        {RAWSWAPOUT, ASN_COUNTER, RONLY, var_extensible_vmstat, 1, {RAWSWAPOUT}},        {IOSENT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {IOSENT}},        {IORECEIVE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,         {IORECEIVE}},        {IORAWSENT, ASN_COUNTER, RONLY, var_extensible_vmstat, 1, {IORAWSENT}},        {IORAWRECEIVE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {IORAWRECEIVE}},        {SYSINTERRUPTS, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,         {SYSINTERRUPTS}},        {SYSCONTEXT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,         {SYSCONTEXT}},        {CPUUSER, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUUSER}},        {CPUSYSTEM, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,         {CPUSYSTEM}},        {CPUIDLE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUIDLE}},        {CPURAWUSER, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWUSER}},        {CPURAWNICE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWNICE}},        {CPURAWSYSTEM, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWSYSTEM}},        {CPURAWKERNEL, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWKERNEL}},        {CPURAWIDLE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWIDLE}},        {SYSRAWINTERRUPTS, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {SYSRAWINTERRUPTS}},        {SYSRAWCONTEXT, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {SYSRAWCONTEXT}},        {CPURAWWAIT, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWWAIT}},        {CPURAWINTR, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWINTR}},        {CPURAWSOFTIRQ, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,         {CPURAWSOFTIRQ}},        /*         * Future use:          */        /*         * {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {ERRORFLAG }},         * {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1, {ERRORMSG }}         */    };    /*     * Define the OID pointer to the top of the mib tree that we're     * registering underneath      */    oid             vmstat_variables_oid[] = { NETSNMP_UCDAVIS_MIB, 11 };    /*     * register ourselves with the agent to handle our mib tree      */    REGISTER_MIB("ucd-snmp/vmstat", extensible_vmstat_variables, variable2,                 vmstat_variables_oid);}static voidgetstat(unsigned long *cuse, unsigned long *cice, unsigned long *csys,        unsigned long *cide, unsigned *pin, unsigned *pout,        unsigned *swpin, unsigned *swpout, unsigned *itot, unsigned *i1,        unsigned *ct, unsigned long *ciow, unsigned long *cirq,	unsigned long *csoft){    int             statfd, vmstatfd;    static int      first = 1;    static char    *buff = NULL, *vmbuff = NULL;    static int      bsize = 0, vmbsize = 0;    char           *b, *c;    time_t          now;    unsigned long long cpunum;    unsigned long long cusell = 0, cicell = 0, csysll = 0, cidell = 0,        ciowll = 0, cirqll = 0, csoftll = 0, ctll = 0, itotll = 0, i1ll = 0;    time(&now);    if (cache_time + CACHE_TIMEOUT < now) {	if ((statfd = open(STAT_FILE, O_RDONLY, 0)) == -1) {	    snmp_log_perror(STAT_FILE);	    return;	}        if (bsize == 0) {            bsize = 256;            buff = malloc(bsize);        }        while (read(statfd, buff, bsize) == bsize) {            bsize += 256;            buff = realloc(buff, bsize);            DEBUGMSGTL(("vmstat", "/proc/stat buffer increased to %d\n", bsize));            close(statfd);            statfd = open(STAT_FILE, O_RDONLY, 0);        }        close(statfd);	if (has_vmstat && (vmstatfd = open(VMSTAT_FILE, O_RDONLY, 0)) != -1) {	    if (vmbsize == 0) {		vmbsize = 256;		vmbuff = malloc(vmbsize);	    }	    while (read(vmstatfd, vmbuff, vmbsize) == vmbsize) {		vmbsize += 256;		vmbuff = realloc(vmbuff, vmbsize);		close(vmstatfd);		vmstatfd = open(VMSTAT_FILE, O_RDONLY, 0);	    }	    close(vmstatfd);	}	else	    has_vmstat = 0;	cache_time = now;    }    *itot = 0;    *i1 = 1;    c = buff;    while ((c = strstr(c+1, "cpu")) != NULL)        b = c;    sscanf(b, "cpu%llu", &cpunum);    cpunum++;    b = strstr(buff, "cpu ");    if (b) {	if (!has_cpu_26 ||            sscanf(b, "cpu  %llu %llu %llu %llu %llu %llu %llu", &cusell,                   &cicell, &csysll, &cidell, &ciowll, &cirqll, &csoftll) != 7) {	    has_cpu_26 = 0;	    sscanf(b, "cpu  %llu %llu %llu %llu", &cusell, &cicell, &csysll,                   &cidell);	    *ciow = *cirq = *csoft = 0;	} else {  	    *ciow = (unsigned long)(ciowll/cpunum);  	    *cirq = (unsigned long)(cirqll/cpunum);  	    *csoft = (unsigned long)(csoftll/cpunum); 	}	*cuse = (unsigned long)(cusell/cpunum);	*cice = (unsigned long)(cicell/cpunum);	*csys = (unsigned long)(csysll/cpunum);	*cide = (unsigned long)(cidell/cpunum);    }    else {	if (first)	    snmp_log(LOG_ERR, "No cpu line in %s\n", STAT_FILE);	*cuse = *cice = *csys = *cide = *ciow = *cirq = *csoft = 0;    }    if (has_vmstat) {	b = strstr(vmbuff, "pgpgin ");	if (b)

⌨️ 快捷键说明

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