Linux c 获取cpu使用率(2)
上一篇博文当中,我们谈论了在Linux中如何获取执行命令行的结果,最终得到cpu的 使用率,但是十分不幸的事情是:
1)通过top -n 1 | grep Cpu获取的cpu使用率不会刷新,每次读取结果只能够得到第一次执行的结果。
2)可能导致SIGNAL上的冲突
新的代码的解决原理:
通过读取/proc/stat中的数据计算得出cpu的使用率
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/statfs.h>
#include <sys/vfs.h>
#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<lineNumber))
{
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;
}
当然,由于是从一个文件当中复制粘贴的,以上代码可能在头文件上有问题,并且代码的注释也不一定准确,有待使用者自己甄别。
Linux c 获取cpu使用率(2)的更多相关文章
- Linux c 获取cpu使用率
部分代码改编自来自http://blog.csdn.net/primeprime/article/details/41458731 主要的原理就是获取top -n 1 | grep Cpu执行的结果, ...
- 简单获取cpu使用率,以及后台运行的问题
做了一个运维平台,有一个功能定时执行一个脚本,获取cpu使用率和内存使用情况到监控平台. 获取cpu使用率使用的是top中的信息.直接运行没有问题.通过nohup xxx.sh & 之后获取不 ...
- Linux上获取CPU Core个数的实现
Linux上获取CPU Core个数的实现 可以通过多种手段取得CPU Core的个数,如: 1) 调用系统提供的函数get_nprocs(),可以在头文件sys/sysinfo.h中发现它 2) 借 ...
- Linux系统获取CPU温度
Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...
- linux下实现CPU使用率和内存使用率获取方法
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了. 方法就是读取proc下的文件来获取了. cpu使用率: /proc/stat ,内存使用情况: /p ...
- Linux系统中CPU使用率查询常用的5个命令
在程序开发中,我们一般都是在Linux系统上进行开发,因此对Linux系统的维护工作很重要.在Linux系统维护中,我们需要经常查看的就是cpu的使用率,分析系统的整体运行情况.那CPU使用率怎么查询 ...
- 转载 - LINUX下查看CPU使用率的命令
几个常用的命令,一些不错的解释 http://blog.csdn.net/wengpingbo/article/details/6302058 1.top 使用权限:所有使用者 使用方式:top [- ...
- shell 获取cpu使用率
1.shell脚本获取主机每颗CPU使用率的方法. #!/bin/bash interval= cpu_num=`-] -c` start_idle=() start_total=() cpu_rat ...
- LINUX下查看CPU使用率的命令[Z]
1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或 ...
随机推荐
- 爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key
现象: 1.在A方法中根据key查询一个list,可以获取到相应的值 2.在B方法中同样调用此方法,传入相同的key,查询不到值,为null,报空指针异常 起初我也一脸懵逼,到现在虽然解决了,还是不知 ...
- svg---基础1
svg:可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网制定,是一个开放标准. 官网:http://www.w3.org/2000/svg ...
- Git 版本还原命令
转载:https://blog.csdn.net/yxlshk/article/details/79944535 1.需求场景: 在利用github实现多人协作开发项目的过程中,有时会出现错误提交的情 ...
- Servlet CDI example analysis
上下文和依赖注入(CDI)使您的对象能够自动为它们提供依赖项,而不是创建它们或将它们作为参数接收.CDI还为您管理这些依赖项的生命周期. 例如,考虑以下servlet: @WebServlet(&qu ...
- jQuery Gantt Edit:(一)参数以及方法说明
jQuery Gantt editor jQuery Gantt Edit(以下简称GE)是一款开源的基于jQuery的甘特图插件,作者:robicch. GitHub地址:https://githu ...
- Spring的基础注解
Spring的基础注解 1.注解的概述 注解是为了便于程序的调试而用于代替配置文件的一种程序语法,与配置文件具有互换性.通常基于注解编程的程序更加简洁. (注:使用Spring注解必须导入aop包) ...
- python中import与from方法总结
一.模块&包简介 模块:所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from). 包(package): 包是更大的组织单位,用来 ...
- threejs 草场足球运动视角(三)
这次要模拟的场景如下图:就是在绿草地上足球的运动,并且视角会随着足球的运动发生变化,同时整个草地的视角也会旋转. 接下来,我们就对各个元素进行分析: 1,草地 用PlaneGeometry在三维空间里 ...
- spring data jpa开启批量插入、批量更新
spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...
- React-native完整配置流程
开头敲黑板!! 无论你是RN的新手还是老手,跟着流程走,RN项目搭建起来完全不是问题! 一.网址收集 expo配置网址:https://blog.expo.io/building-a-react- ...