linux c读取CPU和内存的使用情况

/* *
* get cpu and memory info
* wangzeng 2009.05.04
*/
#include
< stdio.h >
#include
< unistd.h >
#include
< time.h >
#include
< sys / types.h >

// cpu
struct  cpustatus
{
        
long   total;
        
float  user;
        
float  nice;
        
float  system;
        
float  idle;
};

// memory
struct  meminfo
{
        
char  total[ 20 ];
        
char  free[ 20 ];
};

void  errmsg( char   * msg);
void  get_cpu_status( struct  cpustatus  * );
void  get_mem_info( struct  meminfo  * );
void  write_log( struct  cpustatus  * , struct  meminfo  * );

int  main( int  ac, char   * av[])
{
struct  cpustatus cpu_stat;
struct  meminfo mem_info;
get_cpu_status(
& cpu_stat);
printf(
" user\t nice\t system\t idle\n " );
printf(
" %4.2f\t %4.2f\t %4.2f\t %4.2f\n " ,cpu_stat.user,cpu_stat.nice,cpu_stat.system,cpu_stat.idle);
get_mem_info(
& mem_info);
printf(
" total:\t%s\n " ,mem_info.total);
printf(
" free:\t%s\n " ,mem_info.free);
write_log(
& cpu_stat, & mem_info);
return   0 ;
}

// deal error
void  errmsg( char   * msg)
{
        perror(msg);
        exit(
1 );
}

//  start write cpu and memory info by applend mode
void  write_log( struct  cpustatus  * cpu_stat, struct  meminfo  * mem_info)
{
FILE 
* fp;
long  seconds;
if ((fp = fopen( " cpustatuslog.txt " , " a+ " )) == NULL)
        errmsg(
" open cpustatuslog.txt error\n " );
else
        {
        seconds
= time((time_t * )NULL);
        fprintf(fp,
" %s " ,ctime( & seconds));
        fprintf(fp,
" user\t nice\t system\t idle\n " );
        fprintf(fp,
" %4.2f\t %4.2f\t %4.2f\t %4.2f\n " ,cpu_stat -> user,cpu_stat -> nice,cpu_stat -> system,cpu_stat -> idle);
        fprintf(fp,
" total:\t%s\n " ,mem_info -> total);
        fprintf(fp,
" free:\t%s\n " ,mem_info -> free);
        fprintf(fp,
" -------------------------------\n\n " );
        fclose(fp);
        }
}

//  get cpu status
void  get_cpu_status( struct  cpustatus  * cpu_stat)
{
        unsigned 
int  total;
        
float    user;
        
float    nice;
        
float    system;
        
float    idle;
        
char    cpu[ 21 ];
        
char    text[ 201 ];
        FILE   
* fp;
        fp
= fopen( " /proc/stat " , " r " );
        
while (fgets(text, 200 ,fp))
        {
             
if (strstr(text, " cpu " ))
              {
               sscanf(text,
" %s %f %f %f %f " ,cpu, & user, & nice, & system, & idle);          }
        }
        fclose(fp);
        total
= (user + nice + system + idle);
        user
= (user / total) * 100 ;
        nice
= (nice / total) * 100 ;
        system
= (system / total) * 100 ;
        idle
= (idle / total) * 100 ;
        cpu_stat
-> total = total;
        cpu_stat
-> user = user;
        cpu_stat
-> nice = nice;
        cpu_stat
-> system = system;
        cpu_stat
-> idle = idle;
        
return ;
}

// get memory info
void  get_mem_info( struct  meminfo  * minfo)
{
        FILE 
* fp;
        
int  i,j;
        
char  total[ 20 ];
        
char  free[ 20 ];
        
char  temp[ 80 ];
        
if ((fp = fopen( " /proc/meminfo " , " r " )) == NULL)
                errmsg(
" open meminfo error.\n " );
        
else
        {
                
for (i = 0 ;i < 5 ;i ++ )
                {
                        fgets(temp,
80 ,fp);
                        
if (i == 3 // total info at 3 row
                                strcpy(total,temp);
                        
if (i == 4 // free info at 4 row
                                strcpy(free,temp);
                }
        }
        
if (strlen(total) > 0 )
        {
                
for (i = 0 ,j = 0 ;i < strlen(total);i ++ )
                {
                        
if (isdigit(total[i]))
                                minfo
-> total[j ++ ] = total[i];
                }
                minfo
-> total[j] = ' \0 ' ;
        }
        
if (strlen(free) > 0 )
        {
                
for (i = 0 ,j = 0 ;i < strlen(free);i ++ )
                {
                        
if (isdigit(free[i]))
                                minfo
-> free[j ++ ] = free[i];
                }
                minfo
-> free[j] = ' \0 ' ;
        }
        
return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值