2017-04-18 88 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中獲得物理內存大小的正確方法是什麼?

回答

2

這是由於溢出。當超過4十億(如4GB + RAM)參與人數,確保使用64位+類型:

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; 

這裏是一個自包含的例子:

#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