linux下读取系统内存的demo

#include <stdio.h>

#define KIBIBYTE_SIZE 1024LL
#define MEBIBYTE_SIZE 1048576LL
#define GIBIBYTE_SIZE 1073741824LL
#define TEBIBYTE_SIZE 1099511627776LL

typedef enum {
    DIGIT_UNIT_BYTE,
    DIGIT_UNIT_KIBIBYTE,
    DIGIT_UNIT_MEBIBYTE,
    DIGIT_UNIT_GIBIBYTE,
    DIGIT_UNIT_TEBIBYTE
} DigitUnit;

static char*
find_suffix (const char* str)
{
    while (str[0] != 0 && (isdigit (str[0]) || strchr(",.-", str[0]) || isspace (str[0])))
        str++;
    return (char *) str;
}

static char*
find_digit (const char* str)
{
    while (str[0] != 0 && (!isdigit (str[0])))
        str++;
    return (char *) str;
}

static DigitUnit
parse_unit_suffix (const char* suffix)
{
   if (strlen (suffix) > 0) {
        switch (tolower (suffix[0])) {
            case ‘b‘: return DIGIT_UNIT_BYTE;
            case ‘k‘: return DIGIT_UNIT_KIBIBYTE;
            case ‘m‘: return DIGIT_UNIT_MEBIBYTE;
            case ‘g‘: return DIGIT_UNIT_GIBIBYTE;
            case ‘t‘: return DIGIT_UNIT_TEBIBYTE;
        }
    }

    return -1;
}

long long unit_size (DigitUnit unit)
{
    switch (unit) {
        case DIGIT_UNIT_BYTE:
            return 1;
        case DIGIT_UNIT_KIBIBYTE:
            return KIBIBYTE_SIZE;
        case DIGIT_UNIT_MEBIBYTE:
            return MEBIBYTE_SIZE;
        case DIGIT_UNIT_GIBIBYTE:
            return GIBIBYTE_SIZE;
        case DIGIT_UNIT_TEBIBYTE:
            return TEBIBYTE_SIZE;
    }
}

typedef struct {
    long long total;
    long long used;
} MemInfo;

int
meminfo (MemInfo *meminfo)
{
    char line[128];
    FILE* fp;
    long long totalmem;
    long long usedmem;
    char *digit;
    char *suffix;

    totalmem = 0;
    usedmem = 0;
    digit = 0;
    suffix = 0;

    memset (line, 0, 128);
    fp = fopen ("/proc/meminfo", "rb");
    if (fp < 0) {
        return -1;
    }

    fgets (line, 128, fp);

    digit = find_digit (line);
    suffix = find_suffix (digit);

    if (sscanf (digit, "%d", &totalmem) == 1) {
        meminfo->total = totalmem * unit_size(parse_unit_suffix(suffix));
    }

    fgets (line, 128, fp);

    digit = find_digit (line);
    suffix = find_suffix (digit);

    if (sscanf (digit, "%d", &usedmem) == 1) {
        meminfo->used = usedmem * unit_size(parse_unit_suffix(suffix));
    }

    return 0;
}

int main()
{
    MemInfo mem;
    meminfo (&mem);

    printf ("total:%lld used:%lld\n", mem.total, mem.used);

    return 0;
}
时间: 2024-11-05 06:04:39

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

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

在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux 下查看内存使用情况的free命令: [[email protected] tmp]# free total used free shared buffers cached Mem: 3266180 3250004 16176 0 110652 2668236 -/+ buffers/cache: 471116 2795064 Swap: 2048276

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

系统的内存使用信息能够在虚拟文件系统/proc/meminfo中找到,如图 所以只要打开/proc/meminfo文件,然后从中读取信息就好了 #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#define MEM_PART "/proc/meminfo" //用于存储内存信息的结构体str

Linux 下增大tomcat内存

我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m" 正文: 常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryErro

支持windows linux下将指定内存段转为16进制与ascii码的日志输出类

来源:http://blog.csdn.net/lezhiyong 1. 简介 将指定内存段转为16进制与asci码的输出到日志文件的类. 2. 功能介绍 1) 支持window与linus双系统. 2) 可指定输出目录. 3) 日志能输出的时间精确到毫秒,日志能输出线程号. 4) 提供字符串输出. 5) 提供指定内存转换为16进制输出. 6) 提供指定内存转换为16进制和ascii码同时输出. 7) 可调整16进制输出间距. 3. 原理和算法 1) 模块是基于C++语言编写: 2) 通过条件定

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

linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关注0人评论57974人阅读2014-12-06 20:17:16 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH LIBRARY        If bc is invoked w

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

java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space --------------------------------------------------------- 这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理. 一.java.lang.OutOfMemoryError: PermGen space PermGen space的全称

Qt linux下设置系统时间

想要能修改 ARM板上的系统时间,试了两种方法: 1.采用系统命令.system() 尝试了很多命令,date -s "20090807 16:02:23" :date -s 16:02:23 :但板子上的日期就是设置不成功,采用date -s 16:02:23 可以将时间设置成功.于是不得不考虑别的方法. 2.标准C库 首先感叹下,C库很强大呀! 而且我觉着C库的移植行很好.相比较采用system()命令,可能由于linux 版本的不同,好多命令可能存在差异,比如redhat 和ub

Linux下读取默认MAC地址

Linux下读取默认MAC地址 导读 MAC(Media Access Control,介质访问控制)计算机通过它来定义并识别网络设备的位置.在嵌入式linux学习中不可避免也会遇到MAC,本文主要描述了如何通过操作OTP来读取嵌入式linux设备网卡中的MAC地址! 一.适用范围 这里主要介绍读取网卡MAC地址的方法,适用于EasyARM-i.MX287A开发套件,其应用原理及配套示例也适用于下表1.1所列出的产品型号. 二.原理介绍 MAC(Media Access Control,介质访问

linux下查看系统的发行版本及位数

linux下查看系统的发行版本:lsb_release -a 查看32.64位:1. getconf LONG_BIT 2. file /bin/ls 3. uname -a