zoukankan      html  css  js  c++  java
  • 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,'',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(" %d ",sizeof(*result));
    if(strlen(buffer)>sizeof(*result))//不能够这么写,虽然fgets读取一行后会在末尾加上'',但是sizeof(result)得到的结果却是result本身类型的大小,所以不能够这么算。当静态数组传入函数时,在函数内部只能知道它是一个指针
    {
    return 0;
    }*/


    if(0!=fclose(filePointer))
    {
    return 0;
    }

    if(0!=strcmp(buffer,EMPTY_STR))
    {
    while(NULL!=(temp=strstr(buffer," ")))
    {
    *temp='';
    }

    while(NULL!=(temp=strstr(buffer," ")))
    {
    *temp='';
    }


    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(" getCpuInfo param null! ");
    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(" calCpuInfo2 param null! ");
    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 ",usage_i,usage_f);
    return usage_f;
    }
    }
    }

    return -1;

    }

    当然,由于是从一个文件当中复制粘贴的,以上代码可能在头文件上有问题,并且代码的注释也不一定准确,有待使用者自己甄别。

  • 相关阅读:
    重定向URL
    【有意思的BUG】分享按钮 分享功能
    【有意思的BUG】浏览器的Title和Icon
    【有意思的BUG】需要停止的进程
    【NO.8】jmeter-场景-上传文件-send-a-file
    nmon-监控测试服务器
    SecureCRT-转换密钥-Xshell-配置服务-使用xshell登录远程linux服务器
    <转>【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
    javascript判断鼠标按键和键盘按键的方法
    javascript 中几种实用的跨域方法原理详解(转)
  • 原文地址:https://www.cnblogs.com/thegodofthunder/p/7374390.html
Copyright © 2011-2022 走看看