Linux c获取CPU占用率

第一步:
查看/proc/stat
这里面统计的是CPU的信息。第一行是所有CPU的统计信息。我们需要前4个数字

cpu  130216 19944 162525 1491240 3784 24749 17773 0 0 0

前四位分别表示:
user,nice, system, idle
将他们相加得到total_CPU

第二步:
查看/proc/数字(pid)/stat
这里统计的是某个进程的信息,路径中的数字就是进程的pid。
这里有52个数字。我们需要第14和15个,表示该程序的用户态时间和内核态时间
将这两个数字相加得到proc_CPU

第三步
查看CPU个数
再/proc/cpuinfo里面查看
记为num_CPU

第四步
统计一次total_CPU和proc_CPU记为total_CPU1和proc_CPU1
sleep3秒钟
再统计一次total_CPU和proc_CPU记为total_CPU2和proc_CPU2

然后根据公式统计出CPU占用率
num_CPU*(proc_CPU2-proc_CPU1)*100.0/(total_CPU2-total_CPU1)

代码

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

FILE *CPULog;

void shutdownGetCPU()
{
	fclose(CPULog);
	exit(0);
}

//获取总的CPU时间
unsigned long get_cpu_total_occupy(){
	
	FILE *fd;
	long int temp[10];
	char buff[1024]={0};
	fd =fopen("/proc/stat","r");
		
	fgets(buff,sizeof(buff),fd);
	char name[64]={0};
	sscanf(buff,"%s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",name,&temp[0],&temp[1],&temp[2],&temp[3],&temp[4],&temp[5],&temp[6],&temp[7],&temp[8],&temp[9]);
	fclose(fd);
	
	//temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9]

	return temp[0]+temp[1]+temp[2]+temp[3];
}
 
 
//获取进程的CPU时间
int get_cpu_proc_occupy(unsigned int pid){
	char file_name[64]={0};
	FILE *fd;
	char line_buff[1024]={0};
	
	sprintf(file_name,"/proc/%d/stat",pid);
	fd = fopen(file_name,"r");
	if(NULL == fd){
		return 0;
	}
	
	fgets(line_buff,sizeof(line_buff),fd);
	
	char temp[3][64];
	int i,cnt=0,p=0;
	int len=strlen(line_buff);
	for(i=0;i100.0)pcpu=100.0;
	}
	else 
		printf("total is 0\n");
	
	return pcpu;
}
 

 
//进程本身
int get_pid(const char* process_name)
{
	char* user = getlogin();
	
	char cmd[512];
	if (user){
		sprintf(cmd, "pgrep %s -u %s", process_name, user);	
	}
 
	FILE *pstr = popen(cmd,"r");	
	
	if(pstr == NULL){
		return 0;	
	}
 
	char buff[512];
	memset(buff, 0, sizeof(buff));
	if(NULL == fgets(buff, 512, pstr)){
		return 0;
	}
 
	return atoi(buff);
}
 
 
int main(int argc, char *argv[])
{
	CPULog=fopen("CPULog.csv","w");
	unsigned int ppid=getppid();
	printf("GetCPU pid:%d ppid:%u\n",getpid(),ppid);
	while(1)
	{
		signal(SIGUSR1,shutdownGetCPU);
		//printf("%f,",get_proc_cpu(pid));
		fprintf(CPULog,"%f,",get_proc_cpu(ppid));
	}
	fclose(CPULog);
	return 0;
}

你可能感兴趣的:(Linux)