htop 内存使用率计算

来源:互联网 发布:未注册网络什么意思 编辑:程序博客网 时间:2024/05/22 13:09
inux下的内存CPU等资源的使用情况可通过解析伪文件系统/proc中的相关文件获得。htop就是通过解析该目录下的/proc/meminfo文件得到CPU的核数以及动态的使用情况。
通过cat /proc/meminfo命令可以查看该文件内容,非常直观,这里不多解释。

可通过如下代码计算内存的使用率:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define startsWith(s, match) (strstr((s), (match)) == (s))typedef struct MemInfo{unsigned long long totalMem;unsigned long long freeMem;}MemInfo;void memUse(){FILE *fp = fopen("/proc/meminfo", "r");if(fp == NULL)exit(1);MemInfo memi;char buffer[128];while(1){while(fgets(buffer, 128, fp)){if(startsWith(buffer, "MemTotal:"))sscanf(buffer, "MemTotal: %llu kB", &memi.totalMem);else if(startsWith(buffer, "MemFree:"))sscanf(buffer, "MemFree: %llu kB", &memi.freeMem);}double userate = 1.0 * (memi.totalMem - memi.freeMem) / memi.totalMem * 100.0;printf("total=%llu kB, free=%llu kB\n", memi.totalMem, memi.freeMem);printf("memUseRate=%.3lf%%\n", userate);sleep(2);fflush(fp);rewind(fp);}}void main(){memUse();}


对htop源代码感兴趣的话,可以研读以下htop相关的代码片段:

htop源码获取:http://download.csdn.net/detail/u014495327/7142007

 char buffer[128];      while (fgets(buffer, 128, file)) {            switch (buffer[0]) {         case 'M':            if (String_startsWith(buffer, "MemTotal:"))               sscanf(buffer, "MemTotal: %llu kB", &this->totalMem);            else if (String_startsWith(buffer, "MemFree:"))               sscanf(buffer, "MemFree: %llu kB", &this->freeMem);            else if (String_startsWith(buffer, "MemShared:"))               sscanf(buffer, "MemShared: %llu kB", &this->sharedMem);            break;         case 'B':            if (String_startsWith(buffer, "Buffers:"))               sscanf(buffer, "Buffers: %llu kB", &this->buffersMem);            break;         case 'C':            if (String_startsWith(buffer, "Cached:"))               sscanf(buffer, "Cached: %llu kB", &this->cachedMem);            break;         case 'S':            if (String_startsWith(buffer, "SwapTotal:"))               sscanf(buffer, "SwapTotal: %llu kB", &this->totalSwap);            if (String_startsWith(buffer, "SwapFree:"))               sscanf(buffer, "SwapFree: %llu kB", &swapFree);            break;         }      }




0 0