4

我最近使用 sysinfo systemcall 编写了以下 C 代码来显示系统统计信息,让我感到有趣的是 sysinfo 结构的 freeram 变量不返回可用 RAM 的数量,而是返回当前的 RAM 使用情况。我不得不使用一种变通方法通过从 totalram 中减去 freeram 来显示正确的值。我试过用谷歌搜索这个特定的变量,但无济于事。对这种奇怪行为的任何洞察都会非常有帮助。

/*
 * C program to print the system statistics like system uptime, 
 * total RAM space, free RAM space, process count, page size
 */

#include <sys/sysinfo.h>    // sysinfo
#include <stdio.h>
#include <unistd.h>     // sysconf
#include "syscalls.h"       // just contains a wrapper function - error

int main()
{
    struct sysinfo info;

    if (sysinfo(&info) != 0)
        error("sysinfo: error reading system statistics");

    printf("Uptime: %ld:%ld:%ld\n", info.uptime/3600, info.uptime%3600/60, info.uptime%60);
    printf("Total RAM: %ld MB\n", info.totalram/1024/1024);
    printf("Free RAM: %ld MB\n", (info.totalram-info.freeram)/1024/1024);
    printf("Process count: %d\n", info.procs);
    printf("Page size: %ld bytes\n", sysconf(_SC_PAGESIZE));

    return 0;
}
4

3 回答 3

3

“free ram”字段对大多数人来说毫无意义。最接近真正的“免费 ram”值的是从 中获取字段并从中/proc/meminfo减去。如果交换正在使用,结果可能是负面的(这意味着分配的内存多于物理内存的容量);如果您也想将交换计为内存,只需将其用作您的总数。Committed_ASMemTotalMemTotal+SwapTotal

于 2012-01-24T15:13:24.243 回答
1

消除

#include "syscalls.h"

可能是,您从某个地方借用了代码并进行了编辑。双引号用于导入非官方的头文件。该自定义头文件并不是真正需要的。

这不是必需的。您的代码将运行良好。

在我的电脑上,freeram 的值$free -m与程序的 info.freeram 相匹配。显然,freeram 并不是你想象的那样。

阅读更多关于http://www.redhat.com/advice/tips/meminfo.html

MemFree 是可用内存,MemFree + Buffers + Cached 是可用内存(你想要的)。因此,您只是错误地理解了 freeram 一词。

于 2012-01-24T13:33:13.063 回答
1

你需要乘以 mem_unit。

于 2017-01-28T23:11:37.883 回答