Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> linux下用C語言獲得CPU的占用率

linux下用C語言獲得CPU的占用率

日期:2017/2/7 14:29:16      編輯:Linux教程
 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //頭文件
struct occupy //聲明一個occupy的結構體
{
char name[20]; //定義一個char類型的數組名name有20個元素
unsigned int user; //定義一個無符號的int類型的user
unsigned int nice; //定義一個無符號的int類型的nice
unsigned int system;//定義一個無符號的int類型的system
unsigned int idle; //定義一個無符號的int類型的idle
};
float g_cpu_used; //定義一個全局的float類型g_cpu_used
int cpu_num; //定義一個全局的int類型cup_num
void cal_occupy(struct occupy *, struct occupy *); //聲明無類型的函數cal_occupy包含兩個結構體參數
void get_occupy(struct occupy *); //聲明無類型的函數get_occupy包含一個結構體參數
int main() //主函數開始
{
struct occupy ocpu[10]; //定義occupy結構體變量名是ocpu含10個元素
struct occupy ncpu[10]; //定義occupy結構體變量名是ncpu含10個元素
int i; //定義一個局部int變量i

cpu_num = sysconf(_SC_NPROCESSORS_ONLN); //系統調用返回cpu的個數賦給cpu_num
for(;;) //死循環
{
sleep(1); //等待1秒
get_occupy(ocpu); //調用get函數帶回結構體數組第一次
sleep(1); //等待1秒
get_occupy(ncpu); //調用get函數帶回結構體數組第二次
for (i=0; i<cpu_num; i++) //循環cpu_num-1次
{
cal_occupy(&ocpu[i], &ncpu[i]); //調用cal函數帶回結構體數組
printf("%f \n", g_cpu_used); //打印g_cpu_used的使用情況以6位小數顯示
}
}
}
void
cal_occupy (struct occupy *o, struct occupy *n)//對無類型cal函數含有兩個形參結構體類型的指針變量O和N
{
double od, nd; //定義雙精度實型變量od,nd
double id, sd; //定義雙精度實型變量id,sd
double scale; //定義雙精度實型變量scale
od = (double) (o->user + o->nice + o->system +o->idle);//第一次(用戶+優先級+系統+空閒)的時間再賦給od
nd = (double) (n->user + n->nice + n->system +n->idle);//第二次(用戶+優先級+系統+空閒)的時間再賦給od
scale = 100.0 / (float)(nd-od); //100除強制轉換(nd-od)之差為float類型再賦給scale這個變量
id = (double) (n->user - o->user); //用戶第一次和第二次的時間之差再賦給id
sd = (double) (n->system - o->system);//系統第一次和第二次的時間之差再賦給sd
g_cpu_used = ((sd+id)*100.0)/(nd-od); //((用戶+系統)乖100)除(第一次和第二次的時間差)再賦給g_cpu_used
}
void
get_occupy (struct occupy *o) //對無類型get函數含有一個形參結構體類弄的指針O
{
FILE *fd; //定義文件指針fd
int n; //定義局部變量n為int類型
char buff[1024]; //定義局部變量buff數組為char類型大小為1024

fd = fopen ("/proc/stat", "r"); //以R讀的方式打開stat文件再賦給指針fd
fgets (buff, sizeof(buff), fd); //從fd文件中讀取長度為buff的字符串再存到起始地址為buff這個空間裡
for(n=0;n<cpu_num;n++) //循環cpu_num-1次
{
fgets (buff, sizeof(buff),fd);//從fd文件中讀取長度為buff的字符串再存到起始地址為buff這個空間裡
/*下面是將buff的字符串根據參數format後轉換為數據的結果存入相應的結構體參數 */
sscanf (buff, "%s %u %u %u %u", &o[n].name, &o[n].user, &o[n].nice,&o[n].system, &o[n].idle);
/*下面是錯誤的輸出 */
fprintf (stderr, "%s %u %u %u %u\n", o[n].name, o[n].user, o[n].nice,o[n].system, o[n].idle);
}
fclose(fd); //關閉文件fd
}

Copyright © Windows教程網 All Rights Reserved