首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sysinfo系统调用未返回正确的freeram值

sysinfo系统调用未返回正确的freeram值
EN

Stack Overflow用户
提问于 2012-01-24 21:30:16
回答 3查看 8.7K关注 0票数 4

我最近使用sysinfo systemcall编写了以下C代码来显示系统统计数据,有趣的是,sysinfo结构的freeram变量并不返回空闲RAM的数量,而是返回当前的RAM使用率。我不得不使用一种变通方法,通过从totalram中减去freeram来显示正确的值。我试着用谷歌搜索这个特定的变量,但没有结果。任何对这种奇怪行为的洞察都会很有帮助。

代码语言:javascript
复制
/*
 * 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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-24 21:33:13

删除

代码语言:javascript
复制
#include "syscalls.h"

也许,您从某个地方借用了代码并对其进行了编辑。双引号用于导入非官方的头文件。该自定义头文件实际上并不是必需的。

这是不必要的。你的代码会运行的很好。

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

阅读有关http://www.redhat.com/advice/tips/meminfo.html的更多信息

MemFree是空闲内存& MemFree + Buffers + Cached是可用内存(这是您想要的)。所以,你只是错误地理解了freeram这个术语。

票数 1
EN

Stack Overflow用户

发布于 2012-01-24 23:13:24

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

票数 3
EN

Stack Overflow用户

发布于 2017-01-29 07:11:38

你需要乘以mem_unit。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8987636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档