您的位置:首页 > 其它

获取CPU,内存使用率,磁盘相关信息

2011-12-07 09:28 435 查看
CPU信息
boolget_cpuoccupy(CPU_OCCUPY*cpust)//对无类型get函数含有一个形参结构体类弄的指针O
{
FILE*fd;
charbuff[256];
CPU_OCCUPY*cpu_occupy;
cpu_occupy=cpust;

if((fd=fopen("/proc/stat","r"))<=0)
returnfalse;
memset(buff,0,256);
fgets(buff,sizeof(buff),fd);

sscanf(buff,"%s%u%u%u%u",cpu_occupy->name,&cpu_occupy->user,
&cpu_occupy->nice,&cpu_occupy->system,&cpu_occupy->idle);

fclose(fd);
returntrue;
}

//获取CPU频率MHZ
boolget_cpu_info(unsignedint*total)
{
FILE*fd;
charbuff[256];
charname[128],Hz[128],tmp[128];
char*p;

*total=0;
if((fd=fopen("/proc/cpuinfo","r"))<=0)
returnfalse;
memset(buff,0,256);
for(inti=0;i<7;i++)
{
fgets(buff,sizeof(buff),fd);
}

sscanf(buff,"%s%s%s%s",name,Hz,tmp,tmp);
p=strtok(tmp,".");
*total=atoi(p);

fclose(fd);
returntrue;
}

计算CPU使用率

intcal_cpuoccupy(CPU_OCCUPY*o,CPU_OCCUPY*n)
{
unsignedlongoldtatal,newtotal;
unsignedlongid,sd,nd;
intcpu_use=0;

oldtatal=(unsignedlong)(o->user+o->nice+o->system+o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
newtotal=(unsignedlong)(n->user+n->nice+n->system+n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od

id=(unsignedlong)(n->user-o->user);//用户第一次和第二次的时间之差再赋给id
nd=(unsignedlong)(n->nice-o->nice);
sd=(unsignedlong)(n->system-o->system);//系统第一次和第二次的时间之差再赋给sd
if((newtotal-oldtatal)!=0)
cpu_use=(int)((sd+id+nd)*10000)/(newtotal-oldtatal);//((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
else
cpu_use=0;
returncpu_use;
}


内存信息

boolget_memoccupy(MEM_OCCUPY*mem)//对无类型get函数含有一个形参结构体类弄的指针O
{
FILE*fd;
charbuff[256],tmp[20];
MEM_OCCUPY*m;
m=mem;

if((fd=fopen("/proc/meminfo","r"))<=0)
{
returnfalse;
}

memset(buff,0,256);
fgets(buff,sizeof(buff),fd);
sscanf(buff,"%s%lu%s",m->name,&m->total,tmp);

memset(buff,0,256);
fgets(buff,sizeof(buff),fd);//从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
sscanf(buff,"%s%lu%s",m->name2,&m->free,tmp);

fclose(fd);//关闭文件fd
returntrue;
}


调用函数

boolqury_sys_resource(char*buf)
{
CPU_OCCUPYcpu_stat1;
CPU_OCCUPYcpu_stat2;
MEM_OCCUPYmem_stat;
unsignedintcpu_MHZ;
charxml[1024];
intcpu_used,memused;
floatcpu_use_per=0;

memset(&cpu_stat1,0,sizeof(cpu_stat1));
memset(&cpu_stat2,0,sizeof(cpu_stat2));
memset(&mem_stat,0,sizeof(mem_stat));
memset(xml,0,1024);
//第一次获取cpu使用情况
if(!get_cpuoccupy((CPU_OCCUPY*)&cpu_stat1))
{
if(debug_level)
{
cout<<"getcpustaterr!"<<endl;
}
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
returnfalse;
}

//获取内存
if(!get_memoccupy((MEM_OCCUPY*)&mem_stat))
{
if(debug_level)
{
cout<<"getmemerystaterr!"<<endl;
}
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
returnfalse;
}

if(!get_cpu_info(&cpu_MHZ))
{
if(debug_level)
{
cout<<"getcpuinfoerr!"<<endl;
}
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
returnfalse;
}
sleep(1);

//第二次获取cpu使用情况
if(!get_cpuoccupy((CPU_OCCUPY*)&cpu_stat2))
{
if(debug_level)
{
cout<<"getcpustaterr!"<<endl;
}
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
returnfalse;
}

//计算cpu使用率
cpu_used=cal_cpuoccupy((CPU_OCCUPY*)&cpu_stat1,
(CPU_OCCUPY*)&cpu_stat2);
cpu_use_per=(float)(cpu_used/100.0);
//memeryused
if((mem_stat.total-mem_stat.free)==0)
{
memused=100;
}
else
{
memused=(int)((mem_stat.total-mem_stat.free)*100
/mem_stat.total);
}
sprintf(
xml,
"<Message>\n<CpuTotal=”%d”Used=”%3.1f”/>\n<MemoryTotal=”%ld”Used=”%d”/>\n</Message>",
cpu_MHZ,cpu_use_per,mem_stat.total/1024,memused);
sprintf(
buf,
"HTTP/1.1200OK\nServer:Brainaire\nConnection:close\nContent-type:xml/text;\nContent-Length:%d\n\n%s",
strlen(xml),xml);
if(debug_level)
{
cout<<"memerytotal:"<<mem_stat.total/1024<<",used:"
<<memused<<endl;
cout<<"cpuused="<<cpu_use_per<<"%"<<endl;
cout<<buf;
}
returntrue;
}


获取磁盘分区情况

intget_disk_rw(constchar*disk_name)
{
FILE*fd;
chartmp[256],name[256],a[256],flag[256];
if((fd=fopen("/etc/mtab","r"))<=0)
{
if(debug_level)
{
perror("/etc/mtab");
}
return0;
}
while(fgets(tmp,sizeof(tmp),fd))
{
memset(flag,0,sizeof(flag));
sscanf(tmp,"%s%s%s%s",name,a,a,flag);
if(strcmp(name,disk_name)==0)
{
// cout<<flag<<endl;
for(inti=0;i<256;i++)
{
if((flag[i]=='r'&&((flag[i+1]=='o')||flag[i+1]
==','||flag[i+1]=='\0')))
{
return1;
}
if(flag[i+1]=='\0')
{
return0;
}
}
}
}
return0;
}

voidqury_single_disk_info(constchar*disk_path,char*buf)
{
FILE*fd;
chartmp[256],name[256];
unsignedlonglongtotal,used,avail;
floatftotal,favail;
if(!(fd=popen("df","r")))
{
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
return;
}
while(fgets(tmp,sizeof(tmp),fd))
{
sscanf(tmp,"%s%llu%llu%llu",name,&total,&used,&avail);
if(strcmp(disk_path,name)==0)
{
ftotal=(float)(total/1000000.0);
favail=(float)(avail/1000000.0);
sprintf(
tmp,
"<Message>\n<DiskList>\n<DiskPath=\"%s\"Status=\"%d\"TotalSpace=\"%0.2f\"FreeSpace=\"%0.2f\"/>\n</DiskList>\n</Message>",
disk_path,get_disk_rw(disk_path),ftotal,favail);
sprintf(
buf,
"HTTP/1.1200OK\nServer:Brainaire\nConnection:close\nContent-type:xml/text;\nContent-Length:%d\n\n%s",
strlen(tmp),tmp);
if(debug_level)
cout<<buf<<endl;
return;
}
}
sprintf(tmp,"<Message>\n<DiskList>\n</DiskList>\n</Message>");
sprintf(
buf,
"HTTP/1.1200OK\nServer:Brainaire\nConnection:close\nContent-type:xml/text;\nContent-Length:%d\n\n%s",
strlen(tmp),tmp);
return;
}

voidqury_all_disk_info(char*buf)
{
FILE*fd;
chartmp[256],name[256],res_buf[MAX_BUF_SIZE];
unsignedlonglongtotal,used,avail;
floatftotal,favail;
memset(res_buf,0,MAX_BUF_SIZE);
if(!(fd=popen("df","r")))
{
sprintf(
buf,
"HTTP/1.1500Servererr\nServer:Brainaire\nConnection:close\nContent-Type:text/html;charset=UTF-8\n\n");
return;
}
sprintf(res_buf,"<Message>\n<DiskList>\n");
fgets(tmp,sizeof(tmp),fd);
while(fgets(tmp,sizeof(tmp),fd))
{
sscanf(tmp,"%s%llu%llu%llu",name,&total,&used,&avail);
ftotal=(float)(total/1000000.0);
favail=(float)(avail/1000000.0);
sprintf(
res_buf+strlen(res_buf),
"<DiskPath=\"%s\"Status=\"%d\"TotalSpace=\"%0.2f\"FreeSpace=\"%0.2f\"/>\n",
name,get_disk_rw(name),ftotal,favail);
}

sprintf(res_buf+strlen(res_buf),"</DiskList>\n</Message>");

sprintf(
buf,
"HTTP/1.1200OK\nServer:Brainaire\nConnection:close\nContent-type:xml/text;\nContent-Length:%d\n\n%s",
strlen(res_buf),res_buf);
if(debug_level)
cout<<buf<<endl;
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: