2010-11-19 32 views
1

我試圖編寫一個簡單的程序來提醒我,當內存越來越充足,但我有一些問題與sysinfo(),示例程序是在C中, ve從一個網站抓取了它的代碼似乎沒問題的例子,爲什麼會出現這種情況?對不起,我的英語不是我的母語...C - sysinfo()返回錯誤的值i686

代碼如下:

/* sysinfo.c by [email protected] 
* 
* Display the uptime, load averages, total ram, free ram, 
* shared ram, buffered ram, total swap, free swap, and 
* number of processes running on a linux machine. 
* 
* http://www.metalshell.com/ 
* 
*/ 

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

int main() { 
    int days, hours, mins; 
    struct sysinfo sys_info; 

    if(sysinfo(&sys_info) != 0) 
    perror("sysinfo"); 

    // Uptime 
    days = sys_info.uptime/86400; 
    hours = (sys_info.uptime/3600) - (days * 24); 
    mins = (sys_info.uptime/60) - (days * 1440) - (hours * 60); 

    printf("Uptime: %ddays, %dhours, %dminutes, %ldseconds\n", 
         days, hours, mins, sys_info.uptime % 60); 

    // Load Averages for 1,5 and 15 minutes 
    printf("Load Avgs: 1min(%ld) 5min(%ld) 15min(%ld)\n", 
      sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]); 

    // Total and free ram. 
    printf("Total Ram: %ldk\tFree: %ldk\n", sys_info.totalram/1024, 
             sys_info.freeram/1024); 

    // Shared and buffered ram. 
    printf("Shared Ram: %ldk\n", sys_info.sharedram/1024); 
    printf("Buffered Ram: %ldk\n", sys_info.bufferram/1024); 

    // Swap space 
    printf("Total Swap: %ldk\tFree: %ldk\n", sys_info.totalswap/1024, 
              sys_info.freeswap/1024); 

    // Number of processes currently running. 
    printf("Number of processes: %d\n", sys_info.procs); 

    return 0; 
} 
+0

http://www.metalshell.com/source_code/114/Sysinfo.html – kainlite 2010-11-19 21:15:12

+0

在那個鏈接是源代碼... – kainlite 2010-11-19 21:15:28

+5

你遇到什麼問題?什麼工作不正常? – 2010-11-19 21:16:25

回答

3

重讀你要使用sysinfo什麼和閱讀的手冊頁sysinfo後,我有一個想法,什麼可能打擾你的結果。如果這不是你的問題,那麼你將需要發佈更多(如上述程序的實際輸出和關於它有什麼問題以及爲什麼你認爲這是錯誤的評論)。

舊版本的Linux版本有sysinfo,它與當前版本非常相似,但與它不兼容。在結構中增加了幾個字段,並對記憶字段的含義做了輕微的改變。現在需要將這些字段與mem_unit字段一起解釋。這是因爲有些機器有可能擁有比在一個長整數內表達更多的內存。

這種類型的情況在某些機器上安裝了超過2^32(4GB)RAM的32位x86上變得有點常見。我懷疑這可能是你的問題,因爲你的程序根本沒有提到mem_unit

我認爲,如果你嘗試:

printf("Total Ram: %lluk\tFree: %lluk\n", 
       sys_info.totalram *(unsigned long long)sys_info.mem_unit/1024, 
       sys_info.freeram *(unsigned long long)sys_info.mem_unit/ 1024); 

那麼該行可能會開始產生輸出更有意義給你。處理RAM的其他線路上的類似變化也應該使它們更有意義。

+0

對不起,我是用C語言編寫的新程序,這是我第一個問題,我會在將來的發佈中考慮您的建議,該線路會打印機器的實際內存大小,正如您所說我已安裝4GB並且我的系統運行的是ubuntu 32_x86 。與該作業一切工作正常:)我敢肯定,這個職位也會對其他人有用... – kainlite 2010-11-19 22:57:01

+0

@ kainlite:基於舊的文檔或舊的示例程序,這將是非常容易的,因爲界面已更改。 – nategoose 2010-11-22 15:16:44