第一步:
查看/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;
}