c - Linux C : sysinfo get bad memory values

标签 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 -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,太大了)。

内核:

Linux my_hostname 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

最佳答案

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

Free RAM、Buffer RAM 等也是如此。

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

另见 C - sysinfo() returning bad values i686

关于c - Linux C : sysinfo get bad memory values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760246/

相关文章:

c++ - 128 位 int 是用 C/C++ 中的两条指令编写还是加载?

c - 结构数组在最后一个索引处失败

c - 非常简单的应用程序(使用 2 个按钮递增和递减七段显示器)

c - lseek() 在后面跟新的 open() 时返回 0

linux - Red Hat Enterprise Linux 4 的 Apache httpd 版本

linux - 带有项目列表的 makefile 过程变量,其中一项是带空格的引号字符串

linux - 如何 tar 一组文件?

Golang 检索应用程序正常运行时间

无法理解 sysinfo 返回的负载

c - sysinfo 系统调用在 Linux 上返回错误的负载平均值