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

📄 cpu.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>extern NetsnmpCacheLoad netsnmp_cpu_arch_load;static void _cpu_update_stats( unsigned int, void* );static int _cpuAutoUpdate =  5;static int _cpuHistoryLen;int  cpu_num = 0;static netsnmp_cpu_info *_cpu_head  = NULL;static netsnmp_cpu_info *_cpu_tail  = NULL;static netsnmp_cache    *_cpu_cache = NULL;void init_cpu( void ) {    /*     * If we're sampling the CPU statistics automatically,     *   then arrange for this to be triggered regularly,     *   keeping sufficient samples to cover the last minute.     * If the system-specific code has already initialised     *   the list of CPU entries, then retrieve the first set     *   of stats immediately.     * Otherwise, wait until the regular sampling kicks in.     *     * If we're not sampling these statistics regularly,     *   create a suitable cache handler instead.     */    if ( _cpuAutoUpdate ) {                 _cpuHistoryLen = 60/_cpuAutoUpdate;        snmp_alarm_register( _cpuAutoUpdate, SA_REPEAT, _cpu_update_stats,                             NULL );        if ( _cpu_head )            _cpu_update_stats( 0, NULL );    } else        _cpu_cache = netsnmp_cache_create( 5, netsnmp_cpu_arch_load,                                           NULL, NULL, 0 );}void shutdown_cpu( void ) {    while ( _cpu_head ) {        netsnmp_cpu_info *tmp = _cpu_head;        _cpu_head = _cpu_head->next;        SNMP_FREE(tmp->history);        SNMP_FREE(tmp);    }    _cpu_tail = NULL;}netsnmp_cpu_info *netsnmp_cpu_get_first( void ) {    return _cpu_head;}netsnmp_cpu_info *netsnmp_cpu_get_next( netsnmp_cpu_info *this_ptr ) {    return ( this_ptr ? this_ptr->next : NULL );}    /*     * Work with a list of CPU entries, indexed numerically     */netsnmp_cpu_info *netsnmp_cpu_get_byIdx(  int idx, int create ) {    netsnmp_cpu_info *cpu, *cpu2;        /*         * Find the specified CPU entry         */    DEBUGMSGTL(("cpu", "cpu_get_byIdx %d ", idx));    for ( cpu=_cpu_head; cpu; cpu=cpu->next ) {        if ( cpu->idx == idx ) {            DEBUGMSG(("cpu", "(found)\n"));            return cpu;        }    }    if (!create) {        DEBUGMSG(("cpu", "(not found)\n"));        return NULL;    }        /*         * Create a new CPU entry, and insert it into the list....         */    cpu = SNMP_MALLOC_TYPEDEF( netsnmp_cpu_info );    if (!cpu) {        return NULL;        DEBUGMSG(("cpu", "(failed)\n"));    }    DEBUGMSG(("cpu", "(created)\n"));    cpu->idx = idx;        /* ... either as the first (or only) entry....  */    if ( !_cpu_head || _cpu_head->idx > idx ) {        cpu->next = _cpu_head;        _cpu_head = cpu;        if (!_cpu_tail)            _cpu_tail = cpu;        return cpu;    }        /* ... or in the appropriate position  */    for ( cpu2=_cpu_head; cpu2; cpu2=cpu2->next ) {        if ( !cpu2->next || cpu2->next->idx > idx ) {            cpu->next  = cpu2->next;            cpu2->next = cpu;            if (!cpu->next)                _cpu_tail = cpu;            return cpu;        }    }    if (cpu)        SNMP_FREE(cpu); /* just in case */    return NULL;  /* Shouldn't happen! */}    /*     * Work with a list of CPU entries, indexed by name     */netsnmp_cpu_info *netsnmp_cpu_get_byName( char *name, int create ) {    netsnmp_cpu_info *cpu;        /*         * Find the specified CPU entry         */    for ( cpu=_cpu_head; cpu; cpu=cpu->next ) {        if ( !strcmp(cpu->name, name))            return cpu;    }    if (!create)        return NULL;        /*         * Create a new CPU entry, and append it to the list         */    cpu = SNMP_MALLOC_TYPEDEF( netsnmp_cpu_info );    if (!cpu)        return NULL;    strcpy(cpu->name, name);    if ( _cpu_tail ) {        cpu->idx = _cpu_tail->idx+1;        _cpu_tail->next = cpu;        _cpu_tail       = cpu;    } else {        cpu->idx = 0;        _cpu_head = cpu;        _cpu_tail = cpu;    }    return cpu;}netsnmp_cache *netsnmp_cpu_get_cache( void ) {    return _cpu_cache;}int netsnmp_cpu_load( void ) {        /*         * If we're automatically updating the stats regularly,         * then don't invoke the cache handling.         */    return ( _cpuAutoUpdate ? 1                            : netsnmp_cache_check_and_reload( _cpu_cache ));}    /*     * Call the system-specific load routine regularly,     * keeping track of the relevant earlier results.     */static void_cpu_update_stats( unsigned int reg, void* magic ) {    netsnmp_cpu_info *cpu;    int i;    for ( cpu=_cpu_head; cpu; cpu=cpu->next ) {        if ( !cpu->history ) {            /*             * First time through, we need to create buffers             * for the historical stats             */            cpu->history  = calloc( _cpuHistoryLen, sizeof(struct netsnmp_cpu_history));        } else {            /*             * Otherwise, rotate these values - in descending order             *   with the earliest (relevant) statistics in entry 0.             * This means that the code to calculate the rolling averages             *   is independent of the number of historical samples saved.             */            for (i=0; i<_cpuHistoryLen-2; i++) {                cpu->history[i] = cpu->history[i+1];            }            cpu->history[i].user_hist  = cpu->user_ticks;            cpu->history[i].sys_hist   = cpu->sys_ticks;            cpu->history[i].idle_hist  = cpu->idle_ticks;            cpu->history[i].nice_hist  = cpu->nice_ticks;            cpu->history[i].total_hist = cpu->total_ticks;            cpu->history[i].ctx_hist   = cpu->nCtxSwitches;            cpu->history[i].intr_hist  = cpu->nInterrupts;            cpu->history[i].swpi_hist  = cpu->swapIn;            cpu->history[i].swpo_hist  = cpu->swapOut;            cpu->history[i].pagei_hist = cpu->pageIn;            cpu->history[i].pageo_hist = cpu->pageOut;        }    }    /*     * Now call the system-specific load routine, to     * retrieve the latest set of data.     */    netsnmp_cpu_arch_load( NULL, NULL );    for ( cpu=_cpu_head; cpu; cpu=cpu->next ) {        cpu->total_ticks = cpu->user_ticks +                           cpu->nice_ticks +                           cpu->sys_ticks +                           cpu->idle_ticks +                           cpu->wait_ticks +                           cpu->kern_ticks +                           cpu->intrpt_ticks +                           cpu->sirq_ticks;    }}void _cpu_copy_stats( netsnmp_cpu_info *cpu ){    netsnmp_cpu_info *cpu2;        /*         * Copy "overall" statistics to the 'cpu0' entry         *  on single CPU systems where this isn't done automatically         */    cpu2 = netsnmp_cpu_get_byIdx( 0, 1 );    if (!cpu || !cpu2) return;    cpu2->user_ticks = cpu->user_ticks;    cpu2->nice_ticks = cpu->nice_ticks;    cpu2->sys_ticks  = cpu->sys_ticks;    cpu2->sys2_ticks = cpu->sys2_ticks;    cpu2->idle_ticks = cpu->idle_ticks;    cpu2->wait_ticks = cpu->wait_ticks;    cpu2->kern_ticks = cpu->kern_ticks;    cpu2->intrpt_ticks = cpu->intrpt_ticks;    cpu2->sirq_ticks = cpu->sirq_ticks;    cpu2->nInterrupts  = cpu->nInterrupts;    cpu2->nCtxSwitches = cpu->nCtxSwitches;    cpu2->swapIn     = cpu->swapIn;    cpu2->swapOut    = cpu->swapOut;    cpu2->pageIn     = cpu->pageIn;    cpu2->pageOut    = cpu->pageOut;}

⌨️ 快捷键说明

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