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

📄 cpu_linux.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/hardware/cpu.h>#include <unistd.h>#include <fcntl.h>#define CPU_FILE    "/proc/cpuinfo"#define STAT_FILE   "/proc/stat"#define VMSTAT_FILE "/proc/vmstat"    /* Which field(s) describe the type of CPU */#if defined(__i386__) || defined(__x86_64__)#define DESCR_FIELD  "vendor_id"#define DESCR2_FIELD "model name"#endif#if defined(__powerpc__) || defined(__powerpc64__)#define DESCR_FIELD  "cpu\t"#endif#if defined(__ia64__)	/* since vendor is always Intel ... we don't parse vendor */#define DESCR_FIELD  "family"#endif    /*     * Initialise the list of CPUs on the system     *   (including descriptions)     *     * XXX - Assumes x86-style /proc/cpuinfo format     *       See CPUinfo database at     *           http://www.rush3d.com/gcc/     *                for info on alternative styles     */void init_cpu_linux( void ) {    FILE *fp;    char buf[1024], *cp;    int  i, n = 0;    netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 );    strcpy(cpu->name, "Overall CPU statistics");    fp = fopen( CPU_FILE, "r" );    if (!fp) {        snmp_log(LOG_ERR, "Can't open procinfo file %s\n", CPU_FILE);        return;    }    while ( fgets( buf, sizeof(buf), fp)) {        if ( sscanf( buf, "processor : %d", &i ) == 1)  {            n++;            cpu = netsnmp_cpu_get_byIdx( i, 1 );            cpu->status = 2;  /* running */            sprintf( cpu->name, "cpu%d", i );#if defined(__s390__) || defined(__s390x__)            strcat( cpu->descr, "An S/390 CPU" );#endif        }#ifdef DESCR_FIELD        if (!strncmp( buf, DESCR_FIELD, strlen(DESCR_FIELD))) {            cp = strchr( buf, ':' );            strcpy( cpu->descr, cp+2 );            cp = strchr( cpu->descr, '\n' );            *cp = 0;        }#endif#ifdef DESCR2_FIELD        if (!strncmp( buf, DESCR2_FIELD, strlen(DESCR2_FIELD))) {            cp = strchr( buf, ':' );            strcat( cpu->descr, cp );            cp = strchr( cpu->descr, '\n' );            *cp = 0;        }#endif    }    fclose(fp);    cpu_num = n;}void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu );    /*     * Load the latest CPU usage statistics     */int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {    static char *buff  = NULL;    static int   bsize = 0;    static int   first = 1;    static int   has_cpu_26 = 1;    int          statfd, i;    char        *b1, *b2;    unsigned long long cusell = 0, cicell = 0, csysll = 0, cidell = 0,                       ciowll = 0, cirqll = 0, csoftll = 0;    netsnmp_cpu_info* cpu;    if ((statfd = open(STAT_FILE, O_RDONLY, 0)) == -1) {        snmp_log_perror(STAT_FILE);        return -1;    }    if (bsize == 0) {        bsize = 256;        buff = malloc(bsize);    }    while (read(statfd, buff, bsize) == bsize) {        bsize += 256;        buff = realloc(buff, bsize);        DEBUGMSGTL(("cpu", "/proc/stat buffer increased to %d\n", bsize));        close(statfd);        statfd = open(STAT_FILE, O_RDONLY, 0);    }    close(statfd);        /*         * CPU statistics (overall and per-CPU)         */    b1 = buff;    while ((b2 = strstr( b1, "cpu" ))) {        if (b2[3] == ' ') {            cpu = netsnmp_cpu_get_byIdx( -1, 0 );            if (!cpu) {                snmp_log_perror("No (overall) CPU info entry");                return -1;            }            b1 = b2+4; /* Skip "cpu " */        } else {            sscanf( b2, "cpu%d", &i );                       /* Create on the fly to support non-x86 systems - see init */            cpu = netsnmp_cpu_get_byIdx( i, 1 );            if (!cpu) {                snmp_log_perror("Missing CPU info entry");                break;            }            b1 = b2+5; /* Skip "cpuN " */        }	if (!has_cpu_26 ||            sscanf(b1, "%llu %llu %llu %llu %llu %llu %llu", &cusell,                   &cicell, &csysll, &cidell, &ciowll, &cirqll, &csoftll) != 7) {	    has_cpu_26 = 0;	    sscanf(b1, "%llu %llu %llu %llu", &cusell, &cicell, &csysll,                   &cidell);	} else {            cpu->wait_ticks   = (unsigned long)ciowll;            cpu->intrpt_ticks = (unsigned long)cirqll;            cpu->sirq_ticks   = (unsigned long)csoftll; 	}        cpu->user_ticks = (unsigned long)cusell;        cpu->nice_ticks = (unsigned long)cicell;        cpu->sys_ticks  = (unsigned long)csysll;        cpu->idle_ticks = (unsigned long)cidell;    }    if ( b1 == buff ) {	if (first)	    snmp_log(LOG_ERR, "No cpu line in %s\n", STAT_FILE);    }        /*         * Interrupt/Context Switch statistics         *   XXX - Do these really belong here ?         */    cpu = netsnmp_cpu_get_byIdx( -1, 0 );    _cpu_load_swap_etc( buff, cpu );    /*     * XXX - TODO: extract per-CPU statistics     *    (Into separate netsnmp_cpu_info data structures)     */    first = 0;    return 0;}        /*         * Interrupt/Context Switch statistics         *   XXX - Do these really belong here ?         */void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {    static int   has_vmstat = 1;    static char *vmbuff  = NULL;    static int   vmbsize = 0;    static int   first   = 1;    int          vmstatfd;    char        *b;    unsigned long long pin, pout, swpin, swpout;    unsigned long long itot, iticks, ctx;    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;    if (has_vmstat) {	b = strstr(vmbuff, "pgpgin ");	if (b) {	    sscanf(b, "pgpgin %llu", &pin);            cpu->pageIn  = (unsigned long)pin*2;  /* ??? */	} else {	    if (first)		snmp_log(LOG_ERR, "No pgpgin line in %s\n", VMSTAT_FILE);            cpu->pageIn  = 0;	}	b = strstr(vmbuff, "pgpgout ");	if (b) {	    sscanf(b, "pgpgout %llu", &pout);            cpu->pageOut = (unsigned long)pout*2;  /* ??? */	} else {	    if (first)		snmp_log(LOG_ERR, "No pgpgout line in %s\n", VMSTAT_FILE);            cpu->pageOut = 0;	}	b = strstr(vmbuff, "pswpin ");	if (b) {	    sscanf(b, "pswpin %llu", &swpin);            cpu->swapIn  = (unsigned long)swpin;	} else {	    if (first)		snmp_log(LOG_ERR, "No pswpin line in %s\n", VMSTAT_FILE);            cpu->swapIn  = 0;	}	b = strstr(vmbuff, "pswpout ");	if (b) {	    sscanf(b, "pswpout %llu", &swpout);            cpu->swapOut = (unsigned long)swpout;	} else {	    if (first)		snmp_log(LOG_ERR, "No pswpout line in %s\n", VMSTAT_FILE);            cpu->swapOut = 0;	}    }    else {	b = strstr(buff, "page ");	if (b) {	    sscanf(b, "page %llu %llu", &pin, &pout);            cpu->pageIn  = (unsigned long)pin;            cpu->pageOut = (unsigned long)pout;	} else {	    if (first)		snmp_log(LOG_ERR, "No page line in %s\n", STAT_FILE);            cpu->pageIn  = cpu->pageOut = 0;	}	b = strstr(buff, "swap ");	if (b) {	    sscanf(b, "swap %llu %llu", &swpin, &swpout);            cpu->swapIn  = (unsigned long)swpin;            cpu->swapOut = (unsigned long)swpout;	} else {	    if (first)		snmp_log(LOG_ERR, "No swap line in %s\n", STAT_FILE);            cpu->swapIn  = cpu->swapOut = 0;	}    }    b = strstr(buff, "intr ");    if (b) {	sscanf(b, "intr %llu %llu", &itot, &iticks);        cpu->nInterrupts = (unsigned long)itot;        /* iticks not used? */    } else {	if (first)	    snmp_log(LOG_ERR, "No intr line in %s\n", STAT_FILE);    }    b = strstr(buff, "ctxt ");    if (b) {	sscanf(b, "ctxt %llu", &ctx);        cpu->nCtxSwitches = (unsigned long)ctx;    } else {	if (first)	    snmp_log(LOG_ERR, "No ctxt line in %s\n", STAT_FILE);    }}

⌨️ 快捷键说明

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