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

「フリーラム」フィールドは、ほとんどの人にとって無意味です。実際の「フリーラム」値に最も近いのは、からフィールドを取得し、から/proc/meminfo減算Committed_ASすることMemTotalです。スワップが使用されている場合、結果はマイナスになる可能性があります(これは、物理RAMに収まるよりも多くのメモリが割り当てられていることを意味します)。スワップもメモリとしてカウントしたい場合はMemTotal+SwapTotal、合計として使用してください。

于 2012-01-24T15:13:24.243 に答える
1

削除する

#include "syscalls.h"

たぶん、あなたはどこかからコードを借りて編集しました。非公式のヘッダーファイルをインポートするには、二重引用符が使用されます。そのカスタムヘッダーファイルは実際には必要ありません。

必要ありません。コードは正常に実行されます。

私のPCでは、freeramの値は$free -mプログラムのinfo.freeramと一致します。どうやら、freeramはあなたがそれが示していると思うものではありません。

http://www.redhat.com/advice/tips/meminfo.htmlについてもっと読む

MemFreeは空きメモリであり、MemFree+バッファ+キャッシュされたメモリ(必要なもの)です。つまり、フリーラムという用語を誤って理解しているだけです。

于 2012-01-24T13:33:13.063 に答える
1

mem_unitを掛ける必要があります。

于 2017-01-28T23:11:37.883 に答える