Chinaunix首页 | 论坛 | 博客
  • 博客访问: 661638
  • 博文数量: 156
  • 博客积分: 4833
  • 博客等级: 上校
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-21 19:36
文章分类

全部博文(156)

文章存档

2016年(2)

2013年(1)

2012年(13)

2011年(30)

2010年(46)

2009年(29)

2008年(23)

2007年(12)

分类: LINUX

2010-09-06 17:40:52



#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include
#include
#include


#define  true  1
#define  false 0

struct proc_stat
{
    unsigned int user_mode;
    unsigned int nice;
    unsigned int system_mode;
    unsigned int idle;
    unsigned int iowait;
    unsigned int irq;
    unsigned int softirq;
};


/*
*
*
*
*/
struct proc_stat pre_stat, tmp_stat ;
//byte in 5 second
unsigned int totalbyte;
//handle for statics
struct sigaction timer;

struct timeval sta, stop;


//read proc status
int read_stat(struct proc_stat * stat)
{

    char buf[10][20];
    unsigned int tmp;
    FILE * fd;

    fd = fopen("/proc/stat", "r");
    if(fd < 0)
    {
        printf("fopen(\"/proc/stat\", \"r\")  error  errno(%d)\n", errno);
        return -1;
    }

    fscanf(fd, "%s %d %d %d %d %d %d %d %d", buf[0],
    &stat->user_mode, &stat->nice, &stat->system_mode, &stat->idle,
    &stat->iowait, &stat->irq, &stat->softirq, &tmp);

    fclose(fd);
    return 0;

}


//caculate cpu status
unsigned int cpu_rate(struct proc_stat * start, struct proc_stat * end)
{
    unsigned int total;
    unsigned int idle_rate;

    total = (end->user_mode - start->user_mode) + (end->nice - start->nice) +
    (end->system_mode - start->system_mode) + (end->idle - start->idle) +
    (end->iowait - start->iowait) + (end->irq - start->irq) +
    (end->softirq - start->softirq);
    
//if care remove /*
/*   printf("total:%d   %d,  %d  \n", total, end->idle, start->idle);  */
     idle_rate = (end->idle - start->idle) * 100 / total;
/*   printf("idle:%d\n", idle_rate);     */
    return (100 - idle_rate);
}


void print_info(int arg)
{
    unsigned int msec = 0;    
    unsigned int rate;

    alarm(5);
   
    gettimeofday(&stop , NULL);
    msec = (stop.tv_sec * 1000 + stop.tv_usec / 1000) -
                        (sta.tv_sec * 1000 + sta.tv_usec / 1000);
                         
    read_stat(&tmp_stat);
    rate = cpu_rate(&pre_stat, &tmp_stat);
    printf("cpu_rate: %d%%,time:%d ms\n", rate, msec);

    memcpy(&sta, &stop, sizeof(sta));
    memcpy(&pre_stat, &tmp_stat, sizeof(tmp_stat));  // cpu rate
       
}


int main (int argc, char* argv[])
{
     
    //welcom
     printf("CPU RATE. compile time %s \n" ,__TIME__); 
  
    /////////////////////////////////////////  
    memset(&timer, 0, sizeof(timer));
    timer.sa_flags = SA_RESTART;   
    timer.sa_handler = print_info;
    sigaction(SIGALRM, &timer, NULL);
   
    gettimeofday(&sta , NULL);   
    read_stat(&pre_stat);
    alarm(5);
  
    while(1)
    {

         pause();   
   
    }
 
    return 0;
}



 
阅读(758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~