1

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

核心:

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
4

2 回答 2

2

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

Free RAM、Buffer RAM 等也是如此。

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

另请参阅C - sysinfo() 返回错误值 i686

于 2021-04-18T05:49:08.383 回答
1

实际可用内存为:

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

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

有关示例和详细信息,请参阅此链接此链接

于 2015-02-27T08:42:39.300 回答