linux获取cpu和内存的使用率

#include <sys/sysinfo.h>
#include <sys/statfs.h>
#include <fstream>
#include <string.h>

uint64_t lastTotalUser = 0, lastTotalUserLow= 0, lastTotalSys= 0, lastTotalIdle= 0;

double GetCPUUsedRatio()
{
    /// @brief 获取cpu使用率的百分比

    unsigned long long totalUser, totalUserLow, totalSys, totalIdle, total;
    static double percent = 100.0;

    FILE* procfile = fopen("/proc/stat", "r");
    if(!procfile)
    {
        printf("open stat fail
");
        return 0;
    }
    fscanf(procfile, "cpu %llu %llu %llu %llu", &totalUser, &totalUserLow, &totalSys, &totalIdle);
    fclose(procfile);

    if (totalUser < lastTotalUser || totalUserLow < lastTotalUserLow ||
        totalSys < lastTotalSys || totalIdle < lastTotalIdle)
    {
        //Overflow detection. Just skip this value.
        //percent = -1.0;
    }
    else
    {
        total = (totalUser - lastTotalUser) + (totalUserLow - lastTotalUserLow) + (totalSys - lastTotalSys);
        double temp_percent = total;
        total += (totalIdle - lastTotalIdle);
        temp_percent /= total;
        temp_percent *= 100;
        if(temp_percent > 0 && temp_percent < 100.1)
        {
            percent = temp_percent;
        }
    }

    lastTotalUser = totalUser;
    lastTotalUserLow = totalUserLow;
    lastTotalSys = totalSys;
    lastTotalIdle = totalIdle;

    return percent;
}

double GetMemoryUsedRatio()
{
    /// @brief 获取memory使用率的百分比
    
    FILE* procfile = fopen("/proc/meminfo", "r");
    if(!procfile)
    {
        printf("open meminfo fail
");
        return 0;
    }

    size_t i=0,j=0;
    size_t buflen;
    char *pbuffer=NULL;
    char tmpBuffer[32];
    uint64_t nMemTotal = 0;
    uint64_t nMemAvailable = 0;
    while (getline(&pbuffer, &buflen, procfile)!=-1)
    {
        if(strstr(pbuffer,"MemTotal")!=NULL)
        {
          memset(tmpBuffer,0,sizeof(tmpBuffer));
          for(i=0,j=0;i<strlen(pbuffer);i++)
          {
              if(isdigit(pbuffer[i]))
              {
                  tmpBuffer[j++]=pbuffer[i];
              }
          }
          nMemTotal=atoi(tmpBuffer);
        }
        if(strstr(pbuffer,"MemAvailable:")!=NULL)
        {
          memset(tmpBuffer,0,sizeof(tmpBuffer));
          for(i=0,j=0;i<strlen(pbuffer);i++)
          {
              if(isdigit(pbuffer[i]))
              {
                  tmpBuffer[j++]=pbuffer[i];
              }
          }
          nMemAvailable=atoi(tmpBuffer);
        }

        if(nMemTotal && nMemAvailable)
        {
            break;
        }
    }
    fclose(procfile);

    if (pbuffer!=NULL)
    {
      free(pbuffer);
      pbuffer = NULL;
    }

    double value = ((nMemTotal-nMemAvailable) / (double)nMemTotal) * 100;
    return value;
}
经验分享 程序员 微信小程序 职场和发展