Linux c CPU占有率取得

2907 ワード

ステップ1:/proc/statの統計を見るのはCPUの情報です.1行目はすべてのCPUの統計です.最初の4つの数字が必要です
cpu  130216 19944 162525 1491240 3784 24749 17773 0 0 0

上位4位はそれぞれuser,nice,system,idleが彼らを加算してtotal_を得ることを示した.CPU
ステップ2:/proc/数値(pid)/statここで統計されているプロセスの情報を表示します.パス内の数値はプロセスのpidです.ここには52の数値があります.プログラムのユーザ状態時間とカーネル状態時間を表す14と15の数値が必要です.この2つの数値をproc_CPUに加算します.
ステップ3 CPU個数を確認してから/proc/cpuinfoでnum_と表記するCPU
ステップ4 total_を統計するCPUとproc_CPUをtotal_と記すCPU 1とproc_CPU 1 sleep 3秒で再びtotal_を統計CPUとproc_CPUをtotal_と記すCPU 2と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
"); 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
",getpid(),ppid); while(1) { signal(SIGUSR1,shutdownGetCPU); //printf("%f,",get_proc_cpu(pid)); fprintf(CPULog,"%f,",get_proc_cpu(ppid)); } fclose(CPULog); return 0; }