2017-04-18 3 views
-1
struct sysinfo sys_info; 
int32_t total_ram = 0;  
if (sysinfo(&sys_info) != -1) 
    total_ram = (sys_info.totalram * sys_info.mem_unit)/1024; 

上記コードのtotal_ramの値は3671864です。しかし、/ proc/meminfoは異なる値を示します。合計ramサイズlinux sysinfo vs/proc/meminfo

cat /proc/meminfo | grep MemTotal 
MemTotal:  16255004 kB 

どうして違うのですか? Linuxで物理RAMのサイズを取得する正しい方法は何ですか?

答えて

2

これはオーバーフローによるものです。 (例えば4ギガバイト+ RAMなど)40億以上の番号が含まれている場合は、64ビット+タイプを使用してください:コンパイルして実行すると

#include <stdint.h> 
#include <stdio.h> 
#include <sys/sysinfo.h> 

int main() { 
    struct sysinfo sys_info; 
    int32_t before, after; 
    if (sysinfo(&sys_info) == -1) return 1; 

    before = (sys_info.totalram * sys_info.mem_unit)/1024; 
    after = ((uint64_t)sys_info.totalram * sys_info.mem_unit)/1024; 
    printf("32bit intermediate calculations gives %d\n", before); 
    printf("64bit intermediate calculations gives %d\n", after); 
    return 0; 
} 

$ gcc foo.c -o foo -m32 -Wall -Werror -ansi -pedantic && ./foo 
32bit intermediate calculations gives 2994988 
64bit intermediate calculations gives 61715244 
をここで

struct sysinfo sys_info; 
int32_t total_ram = 0;  
if (sysinfo(&sys_info) != -1) 
    total_ram = ((uint64_t) sys_info.totalram * sys_info.mem_unit)/1024; 

は、自己完結型の例です

関連する問題