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

📄 systeminfo.cpp

📁 一个和TOP程序差不多功能的程序
💻 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 + -