linux cpu使用率 c,Linux c 获取cpu使用率(2)(示例代码)

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

#define FILEBUFFER_LENGTH 5000

#define EMPTY_STR ""

#define CPU_PART "/proc/stat"

struct cpu_cost //存放cpu数据结构体

{

long int user;

long int nice;

long int system;

long int idle;

long int iowait;

long int irq;

long int softirq;

};

//打开fileName指定的文件,从中读取第lineNumber行

//返回值:成功返回1,失败返回0

int get_file_line(char *result,char *fileName,int lineNumber)

{

FILE *filePointer;

int i=0;

char buffer[FILEBUFFER_LENGTH];

char *temp;

memset(buffer,‘\0‘,FILEBUFFER_LENGTH*sizeof(char));

strcpy(buffer,EMPTY_STR);

if((fileName==NULL)||(result==NULL))

{

return 0;

}

if(!(filePointer=fopen(fileName,"rb")))

{return 0;}

while((!feof(filePointer))&&(i

{

if(!fgets(buffer,FILEBUFFER_LENGTH,filePointer))

{

return 0;

}

i++;//差点又忘记加这一句了

}

/* printf("\n%d\n",sizeof(*result));

if(strlen(buffer)>sizeof(*result))//不能够这么写,虽然fgets读取一行后会在末尾加上‘\0‘,但是sizeof(result)得到的结果却是result本身类型的大小,所以不能够这么算。当静态数组传入函数时,在函数内部只能知道它是一个指针

{

return 0;

}*/

if(0!=fclose(filePointer))

{

return 0;

}

if(0!=strcmp(buffer,EMPTY_STR))

{

while(NULL!=(temp=strstr(buffer,"\n")))

{

*temp=‘\0‘;

}

while(NULL!=(temp=strstr(buffer,"\r")))

{

*temp=‘\0‘;

}

strcpy(result,buffer);

}else

{

strcpy(result,EMPTY_STR);

return 0;

}

return 1;

}

//从/proc/stat当中读取与cpu有关的数据,并且保存到结构体当中

int getCpuInfo2(pCPU_cost cpuInfo)

{

char cpuStr[500];

if(NULL==cpuInfo)

{

printf("\ngetCpuInfo param null!\n");

return 0;

}

if(1==get_file_line(cpuStr,CPU_PART,1))

{

sscanf(cpuStr,"%*s %ld %ld %ld %ld %ld %ld %ld",&(cpuInfo->user),&(cpuInfo->nice),&(cpuInfo->system),&(cpuInfo->idle),&(cpuInfo->iowait),&(cpuInfo->irq),&(cpuInfo->softirq));//已修改多打了一个%ld,结果出现错误

return 1;

}

return 0;

}

//根据两次读取的cpu数据计算出cpu使用率,最终计算得到的结果为0~1000之间,1000表示利用率为100%

//参数二:第一次读取的cpu数据结构体

//参数三:第二次读取的cpu数据结构体

int calCpuInfo2(int *cpuUsage,pCPU_cost cpu1,pCPU_cost cpu2)

{

long int total=0,total1=0,total2=0,idle=0,idle1=0,idle2=0,result=0;

if((NULL==cpuUsage)&&(NULL==cpu1)&&(NULL==cpu2))

{

printf("\ncalCpuInfo2 param null!\n");

return 0;

}

total1=cpu1->user+cpu1->nice+cpu1->system+cpu1->idle+cpu1->iowait+cpu1->irq+cpu1->softirq;//第一次读取的总的cpu时间

total2=cpu2->user+cpu2->nice+cpu2->system+cpu2->idle+cpu2->iowait+cpu2->irq+cpu2->softirq;//第二次读取的总的cpu时间

if(total2>total1)

{

total=total2-total1;//总的时间差额

idle1=cpu1->idle;//第一次读取的空闲时间

idle2=cpu2->idle;//第二次读取的空闲时间

idle=idle2-idle1;//空闲时间差额

result=100000*(total-idle);//忙碌时间差额

result=result/total;//使用率=忙碌时间/总时间

*cpuUsage=(int)result;

return 1;

}

return 0;

}

//间隔0.6s读取cpu数据,并计算cpu使用率,返回cpu使用率的百分比

float getCpuUsage()

{

CPU_cost cpu1,cpu2;

int usage_i=0;

float usage_f=0;

if(1==getCpuInfo2(&cpu1))

{

usleep(600000);

if(1==getCpuInfo2(&cpu2))

{

if(1==calCpuInfo2(&usage_i,&cpu1,&cpu2))

{

usage_f=(float)usage_i/1000;

printf("%d %0.3f\n",usage_i,usage_f);

return usage_f;

}

}

}

return -1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值