Linux c CPU占有率取得
2907 ワード
ステップ1:/proc/statの統計を見るのはCPUの情報です.1行目はすべてのCPUの統計です.最初の4つの数字が必要です
上位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)
コード#コード#
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;
}