📄 systeminfo.cpp
字号:
#include "SystemInfo.hpp"
CPU_t *SystemInfo::cpus_refresh ()
{
int num;
char buf[SMLBUFSIZ];
FILE *Cpufp = fopen("/proc/stat", "r");
CPU_t* cpus = (CPU_t*)malloc((1 + Cpu_tot) * sizeof(CPU_t));
if(!Cpufp||!cpus)
{
Cpufp?fclose(Cpufp):0;
return 0;
}
fseek(Cpufp,0,0);
if (!fgets(buf, sizeof(buf), Cpufp)) printf("failed /proc/stat read");
num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
&cpus[Cpu_tot].u,
&cpus[Cpu_tot].n,
&cpus[Cpu_tot].s,
&cpus[Cpu_tot].i,
&cpus[Cpu_tot].w,
&cpus[Cpu_tot].x,
&cpus[Cpu_tot].y
);
if (num < 4)
printf("failed /proc/stat read");
// and just in case we're 2.2.xx compiled without SMP support...
if (Cpu_tot == 1)
{
cpus[1].id = 0;
memcpy(cpus, &cpus[1], sizeof(CPU_t));
}
// now value each separate cpu's tics
for (int i = 0; 1 < Cpu_tot && i < Cpu_tot; i++)
{
if (!fgets(buf, sizeof(buf), Cpufp)) printf("failed /proc/stat read");
cpus[i].x = 0; // FIXME: can't tell by kernel version number
cpus[i].y = 0; // FIXME: can't tell by kernel version number
num = sscanf(buf, "cpu%u %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
&cpus[i].id,
&cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y
);
if (num < 4)
printf("failed /proc/stat read");
}
fclose(Cpufp);
return cpus;
}
SystemInfo::SystemInfo()
{
Cpu_tot=sysconf(_SC_NPROCESSORS_ONLN);
memset(CPU,0,sizeof(CPU));
for(int i=0;i<10;i++)
{
CPU[i].Cpu=cpus_refresh();
}
}
bool SystemInfo::Init()
{
return 0;
}
double SystemInfo::MemInfo()
{
char sStatBuf[256];
FILE *Memfp = fopen("/proc/meminfo", "r");
if(!Memfp)return 0;
memset(sStatBuf, 0, 256);
fseek(Memfp,0,0);
//system("free -m | awk '{print $2,$3}' > mem");
fread(sStatBuf, sizeof(sStatBuf), 1, Memfp);
fclose(Memfp);
int MemTotal,MemFree,Buffers,Cached;
sscanf(sStatBuf,"MemTotal:\t%d kB\nMemFree:\t%d kB\nBuffers:\t%d kB\nCached:\t%d kB\n",&MemTotal,&MemFree,&Buffers,&Cached);
//应用程序的角度来说,可用内存=系统free memory+buffers+cached。
//使用内存=总内存-可用内存
//内存使用百分比=使用内存/总内存
return ((double)MemTotal-MemFree-Buffers-Cached)*100/MemTotal;
}
double SystemInfo::PercentCPU(int Secs)
{
CPU_t *CPU=cpus_refresh();
sleep(Secs);
CPU_t *CPU1=cpus_refresh();
if(!CPU1||!CPU)
return 0;
unsigned long long Total1=0;
unsigned long long Total2=0;
unsigned long long User1=0;
unsigned long long User2=0;
for(int i=0;i<Cpu_tot;i++)
{ Total1+=CPU[i].u+CPU[i].n+CPU[i].s+CPU[i].i+CPU[i].w+CPU[i].x+CPU[i].y;
Total2+=CPU1[i].u+CPU1[i].n+CPU1[i].s+CPU1[i].i+CPU1[i].w+CPU1[i].x+CPU1[i].y;
User1+=CPU1[i].u+CPU1[i].s+CPU1[i].n;
User2+=CPU[i].u+CPU[i].s+CPU[i].n;
}
double usage=((double)User1-User2)*100/(Total2-Total1);
free(CPU);
free(CPU1);
return usage;
}
double SystemInfo::PercentCPU()
{
static long Time=time(0)+1;
long Time1=time(0);
if(Time1>=Time)
{
if(CPU[0].Cpu)
{
free(CPU[0].Cpu);
CPU[0].Cpu=0;
}
for(int i=0;i<9;i++)
{
memcpy(&CPU[i],&CPU[i+1],sizeof(CPU[0]));
}
CPU[9].Cpu=cpus_refresh();
Time=time(0)+1;
}
CPU_t *CPU=this->CPU[0].Cpu;
CPU_t *CPU1=cpus_refresh();
if(!CPU1||!CPU)
return 0;
unsigned long long Total1=0;
unsigned long long Total2=0;
unsigned long long User1=0;
unsigned long long User2=0;
for(int i=0;i<Cpu_tot;i++)
{ Total1+=CPU[i].u+CPU[i].n+CPU[i].s+CPU[i].i+CPU[i].w+CPU[i].x+CPU[i].y;
Total2+=CPU1[i].u+CPU1[i].n+CPU1[i].s+CPU1[i].i+CPU1[i].w+CPU1[i].x+CPU1[i].y;
User1+=CPU1[i].u+CPU1[i].s+CPU1[i].n;
User2+=CPU[i].u+CPU[i].s+CPU[i].n;
}
double usage=((double)User1-User2)*100/(Total2-Total1);
free(CPU1);
return usage;
}
double SystemInfo::GetDiskInfo(char * Path)
{
char *lpBuf=strtok(Path,";");
unsigned long Free=0,Total=0;
struct statfs sfs;
while(lpBuf)
{
int r=statfs(lpBuf, &sfs);
if(0==r)
{
Free+=sfs.f_blocks- sfs.f_bfree;//sfs.f_blocks-sfs.f_bavail;//sfs.f_blocks- sfs.f_bfree;
Total+=sfs.f_blocks;
}
lpBuf=strtok(0,";");
}
return ((double)Free)*100/(Total);
}
double SystemInfo::DiskInfo()
{
// unsigned long TotalDiskSize=0;
char sStatBuf[1024];
memset(sStatBuf,0,sizeof(sStatBuf));
FILE *Diskfp = fopen("/proc/partitions", "r");//partitions
if(!Diskfp)
return 0;
fseek(Diskfp,0,0);
unsigned int DiskNume;
fgets(sStatBuf,sizeof(sStatBuf),Diskfp);
fgets(sStatBuf,sizeof(sStatBuf),Diskfp);
//fread(sStatBuf, sizeof(sStatBuf), 1, Diskfp);
// sscanf(sStatBuf,"major minor\t#blocks\tname\n\n\t%d",&DiskNume);
// char *p=(char*)&sStatBuf[30];
unsigned int Subarea;
unsigned int DiskSize;
char Devame[30];
memset(Devame,0,sizeof(Devame));
struct statfs sfs[3];
double TotalPercent[3];
// struct stat buf;
fgets(sStatBuf,sizeof(sStatBuf),Diskfp);
sscanf(sStatBuf," %d\t%d\t%d\t%s",&DiskNume,&Subarea,&DiskSize,Devame);
statfs("/", &sfs[0]);
TotalPercent[0]=((double)sfs[0].f_blocks- sfs[0].f_bfree);//*100/(sfs.f_blocks);
statfs("/dev", &sfs[1]);
TotalPercent[1]=((double)sfs[1].f_blocks- sfs[1].f_bfree);//*100/(sfs.f_blocks);
statfs("/home", &sfs[2]);
TotalPercent[2]=((double)sfs[2].f_blocks- sfs[2].f_bfree);//*100/(sfs.f_blocks);
fclose(Diskfp);
return ((double)(TotalPercent[0]+TotalPercent[1]+TotalPercent[2]))*100/(sfs[0].f_blocks+sfs[1].f_blocks+sfs[2].f_blocks);
/* if(Subarea)
{
char DevName[50];
memset(DevName,0,sizeof(DevName));
sprintf(DevName,"/dev/%s",Devame);
memset(&sfs,0,sizeof(struct statfs));
statfs(DevName, &sfs);
stat(DevName, &buf);
TotalPercent+=((double)sfs.f_blocks- sfs.f_bfree)*100/(sfs.f_blocks);
}
else if(DiskNume)TotalDiskSize+=DiskSize;
*/ //}while(DiskNume);
return TotalPercent[0];
}
/*
int Exit;
void sig_term(int sigcount)
{
Exit=1;
}
*/
//cpu usage=(idle2-idle1)/(cpu2-cpu1)*100
//cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
/*
int main(int argc, char* argv[])
{
signal(SIGTERM, sig_term);
signal(SIGPIPE, SIG_IGN);
signal(SIGINT, sig_term);
signal(SIGQUIT, sig_term);
SystemInfo info;
while(!Exit)
{
printf("PercentCPU:%0.2f%\n",info.PercentCPU());
printf("MemInfo:%0.2f%\n",info.MemInfo());
printf("DiskInfo:%0.2f%\n\n",info.DiskInfo());
//free(p);
}
printf("process Exit!!\n");
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -