1. #include <stdio.h>
  2.  
  3. #define KIBIBYTE_SIZE 1024LL
  4. #define MEBIBYTE_SIZE 1048576LL
  5. #define GIBIBYTE_SIZE 1073741824LL
  6. #define TEBIBYTE_SIZE 1099511627776LL
  7.  
  8. typedef enum {
  9. DIGIT_UNIT_BYTE,
  10. DIGIT_UNIT_KIBIBYTE,
  11. DIGIT_UNIT_MEBIBYTE,
  12. DIGIT_UNIT_GIBIBYTE,
  13. DIGIT_UNIT_TEBIBYTE
  14. } DigitUnit;
  15.  
  16. static char*
  17. find_suffix (const char* str)
  18. {
  19. while (str[0] != 0 && (isdigit (str[0]) || strchr(",.-", str[0]) || isspace (str[0])))
  20. str++;
  21. return (char *) str;
  22. }
  23.  
  24. static char*
  25. find_digit (const char* str)
  26. {
  27. while (str[0] != 0 && (!isdigit (str[0])))
  28. str++;
  29. return (char *) str;
  30. }
  31.  
  32. static DigitUnit
  33. parse_unit_suffix (const char* suffix)
  34. {
  35. if (strlen (suffix) > 0) {
  36. switch (tolower (suffix[0])) {
  37. case 'b': return DIGIT_UNIT_BYTE;
  38. case 'k': return DIGIT_UNIT_KIBIBYTE;
  39. case 'm': return DIGIT_UNIT_MEBIBYTE;
  40. case 'g': return DIGIT_UNIT_GIBIBYTE;
  41. case 't': return DIGIT_UNIT_TEBIBYTE;
  42. }
  43. }
  44.  
  45. return -1;
  46. }
  47.  
  48. long long unit_size (DigitUnit unit)
  49. {
  50. switch (unit) {
  51. case DIGIT_UNIT_BYTE:
  52. return 1;
  53. case DIGIT_UNIT_KIBIBYTE:
  54. return KIBIBYTE_SIZE;
  55. case DIGIT_UNIT_MEBIBYTE:
  56. return MEBIBYTE_SIZE;
  57. case DIGIT_UNIT_GIBIBYTE:
  58. return GIBIBYTE_SIZE;
  59. case DIGIT_UNIT_TEBIBYTE:
  60. return TEBIBYTE_SIZE;
  61. }
  62. }
  63.  
  64. typedef struct {
  65. long long total;
  66. long long used;
  67. } MemInfo;
  68.  
  69. int
  70. meminfo (MemInfo *meminfo)
  71. {
  72. char line[128];
  73. FILE* fp;
  74. long long totalmem;
  75. long long usedmem;
  76. char *digit;
  77. char *suffix;
  78.  
  79. totalmem = 0;
  80. usedmem = 0;
  81. digit = 0;
  82. suffix = 0;
  83.  
  84. memset (line, 0, 128);
  85. fp = fopen ("/proc/meminfo", "rb");
  86. if (fp < 0) {
  87. return -1;
  88. }
  89.  
  90. fgets (line, 128, fp);
  91.  
  92. digit = find_digit (line);
  93. suffix = find_suffix (digit);
  94.  
  95. if (sscanf (digit, "%d", &totalmem) == 1) {
  96. meminfo->total = totalmem * unit_size(parse_unit_suffix(suffix));
  97. }
  98.  
  99. fgets (line, 128, fp);
  100.  
  101. digit = find_digit (line);
  102. suffix = find_suffix (digit);
  103.  
  104. if (sscanf (digit, "%d", &usedmem) == 1) {
  105. meminfo->used = usedmem * unit_size(parse_unit_suffix(suffix));
  106. }
  107.  
  108. return 0;
  109. }
  110.  
  111. int main()
  112. {
  113. MemInfo mem;
  114. meminfo (&mem);
  115.  
  116. printf ("total:%lld used:%lld\n", mem.total, mem.used);
  117.  
  118. return 0;
  119. }

linux下读取系统内存的demo的更多相关文章

  1. linux 下查看系统内存使用情况的方法

    在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux 下查看内存使用情况的free命令: [root@scs ...

  2. Linux c读取系统内存使用信息

    系统的内存使用信息能够在虚拟文件系统/proc/meminfo中找到,如图 所以只要打开/proc/meminfo文件,然后从中读取信息就好了 #include <stdio.h>#inc ...

  3. Linux 下增大tomcat内存

    我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...

  4. [转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具

    linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关 ...

  5. Linux下获得系统时间的C语言实现

    Linux下获得系统时间的C语言的实现方法 #include<time.h> //C语言的头文件#include<stdio.h> //C语言的I/O   int main() ...

  6. (转)Linux下tomcat JVM内存设置步骤

    java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space -------------- ...

  7. linux 下 取进程占用内存(MEM)最高的前10个进程

    # linux 下 取进程占用 cpu 最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head # linux 下 取进程占用内存 ...

  8. linux下查看系统属性

    inux下查看系统属性1.查看cpu信息查看所有cpu信息:cat /proc/cpuinfo查看cpu类型: grep "model name" /proc/cpuinfo2.查 ...

  9. Linux下修改tomcat内存

    由于服务器上放的tomcat太多,造成内存溢出. 常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemo ...

随机推荐

  1. Spring MVC Json数据传递

    json是一种常见的传递格式,是一种键值对应的格式.并且数据大小会比较小,方便传递.所以在开发中经常会用到json. 首先看一下json的格式: {key1:value1,key2:value2} 每 ...

  2. AppServ设置虚拟主机 及域名连接

    1: 安装好AppServ2.5.9软件,官网是:http://www.appservnetwork.com/ ,2.59下载地址是:http://nchc.dl.sourceforge.net/so ...

  3. javascript之日期对象

    学习要点: 日期对象 将日期对象转换为字符串 将日期对象中的日期和时间转换为字符串 日期对象中的日期 日期对象中的时间 设置日期对象中的日期 设置日期对象中的时间 与毫秒相关的方法 一.日期对象 在j ...

  4. brew udpate出现错误“/usr/local is not writable.”的问题解决

    如图所示: 在命令行输入: sudo chown -R 当前登录的用户名 /usr/local 再次输入: brew update 问题解决.

  5. Spring MVC 关于分页的简单实现

    据本人了解,目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数 ...

  6. 《算法导论》插入排序----InsertSort

    算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...

  7. STM32串口寄存器操作(转)

    源:STM32串口寄存器操作 //USART.C /************************************************************************** ...

  8. PHP 安装使用 gearman

    1.安装服务器端: 官方下载,请到https://launchpad.net/gearmand. yum install boost-devel* gperf* libevent-devel* lib ...

  9. Yii实现Password Repeat Validate Rule

    在使用Yii时遇到这样的需求:在一个注册的页面输入两次密码,并验证两次输入是否一致.可是password的repeat的字段在数据库 并不存在.问题来了,如何创建一个password_repeat的属 ...

  10. 微软企业库DBBA的研究

    Summary:如何入门使用Data Access Application Block,可以参考Enterprise Library 3.1中文帮助:数据访问应用程序块.这篇文章侧重在DAAB工作原理 ...