linux c:sysinfo获取错误的内存值

时间:2015-02-27 08:09:45

标签: c linux sysinfo

我使用sysinfo来获取内存信息。但结果似乎是错误的,因为它与/proc/meminfo不一致。

我的代码:

#include <stdio.h>
#include <sys/sysinfo.h>

double megabyte = 1024 * 1024;

long
get_free_mem() {
    struct sysinfo si;
    int error = sysinfo(&si);
    printf("code error=%d\n",error);
    printf("available: %lu\n", si.freeram );
    printf("total: %lu\n", si.totalram);
    printf("mem_unit: %u \n", si.mem_unit);
    return 0;
}

int main(int argc, char* argv[])
{
    get_free_mem();
    return 0;
}

输出信息是:

$./get_mem 
code error=0
available: 67733753856
total: 135443968000
mem_unit: 1

/proc/meminfo显示:

$cat /proc/meminfo
MemTotal:        8388608 kB
MemFree:         4790464 kB
Buffers:               0 kB
Cached:          3042084 kB

free显示:

$free -m
             total       used       free     shared    buffers     cached
Mem:          8192       3513       4678          0          0       2970
-/+ buffers/cache:        543       7648
Swap:         1952          0       1952

显然我的代码中出现了问题,因为我确实在这台服务器上没有135443968000字节(几乎是126 Gb,大到很小)。

kernal:

Linux my_hosename 2.6.32-220.23.2.ali1113.el5.x86_64 #1 SMP Thu Jul 4 20:09:15 CST 2013 x86_64 x86_64 x86_64 GNU/Linux

2 个答案:

答案 0 :(得分:2)

要获得正确的内存值,例如总 RAM,您需要将 si.totalsi.memunit 相乘,然后除以 1024

同样适用于空闲 RAM、缓冲 RAM 等。

编辑:将 memunit 设置为 1 没有任何问题。

另见C - sysinfo() returning bad values i686

答案 1 :(得分:0)

可用的实际可用内存为:

Actual Free Memory = Free (39 MB) + Buffers (95) + Cached (3590) = 3,724 MB

这比我们原先想象的多95倍的可用内存。只要有空闲可用内存,它就会暂时将其作为缓存和缓冲区。 Linux减少了缓存/缓冲区的使用,并为程序提供了它想要的东西。

请参阅this linkthis link以获取示例和详细信息。