2008-12-08 83 views
19

我剛剛編寫了以下C++函數,以編程方式確定系統安裝了多少RAM。它有效,但在我看來,應該有一個更簡單的方法來做到這一點。有人可以告訴我,如果我錯過了什麼嗎?如何確定C++中Linux系統RAM的數量?

getRAM() 
{ 
    FILE* stream = popen("head -n1 /proc/meminfo", "r"); 
    std::ostringstream output; 
    int bufsize = 128; 

    while(!feof(stream) && !ferror(stream)) 
    { 
     char buf[bufsize]; 
     int bytesRead = fread(buf, 1, bufsize, stream); 
     output.write(buf, bytesRead); 
    } 
    std::string result = output.str(); 

    std::string label, ram; 
    std::istringstream iss(result); 
    iss >> label; 
    iss >> ram; 

    return ram; 
} 

首先,我使用popen("head -n1 /proc/meminfo")獲得從系統中meminfo中文件的第一行。該命令的輸出看起來像

MemTotal:775280 KB

一旦我得到了輸出在istringstream,這是簡單的來標記它讓我在想要的信息。我的問題是,有沒有更簡單的方法來讀取此命令的輸出?是否有一個標準的C++庫調用來讀取大量的系統RAM?

回答

62

在Linux上,你可以用它設置在下面的結構值的函數sysinfo

#include <sys/sysinfo.h> 

    int sysinfo(struct sysinfo *info); 

    struct sysinfo { 
     long uptime;    /* Seconds since boot */ 
     unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ 
     unsigned long totalram; /* Total usable main memory size */ 
     unsigned long freeram; /* Available memory size */ 
     unsigned long sharedram; /* Amount of shared memory */ 
     unsigned long bufferram; /* Memory used by buffers */ 
     unsigned long totalswap; /* Total swap space size */ 
     unsigned long freeswap; /* swap space still available */ 
     unsigned short procs; /* Number of current processes */ 
     unsigned long totalhigh; /* Total high memory size */ 
     unsigned long freehigh; /* Available high memory size */ 
     unsigned int mem_unit; /* Memory unit size in bytes */ 
     char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ 
    }; 

如果你想這樣做只是使用功能C++的(ⅰ將堅持sysinfo)中,i建議服用使用std::ifstreamstd::string一個C++方法:

unsigned long get_mem_total() { 
    std::string token; 
    std::ifstream file("/proc/meminfo"); 
    while(file >> token) { 
     if(token == "MemTotal:") { 
      unsigned long mem; 
      if(file >> mem) { 
       return mem; 
      } else { 
       return 0;  
      } 
     } 
     // ignore rest of the line 
     file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    return 0; // nothing found 
} 
+0

sysinfo完美地工作。謝謝。 – 2008-12-08 16:52:27

0

甚至top(來自procps)解析/proc/meminfo,參見here

4

有沒有必要使用popen(),你可以自己閱讀文件。此外,如果第一行不是您要查找的內容,則會失敗,因爲head -n1只會讀取第一行,然後退出。我不確定爲什麼你要混合使用C和C++ I/O;這非常好,但你應該選擇全部使用C或全部C++。我可能會做這樣的事情:

int GetRamInKB(void) 
{ 
    FILE *meminfo = fopen("/proc/meminfo", "r"); 
    if(meminfo == NULL) 
     ... // handle error 

    char line[256]; 
    while(fgets(line, sizeof(line), meminfo)) 
    { 
     int ram; 
     if(sscanf(line, "MemTotal: %d kB", &ram) == 1) 
     { 
      fclose(meminfo); 
      return ram; 
     } 
    } 

    // If we got here, then we couldn't find the proper line in the meminfo file: 
    // do something appropriate like return an error code, throw an exception, etc. 
    fclose(meminfo); 
    return -1; 
} 
+0

/proc/meminfo的第一行是我之後的信息。我在多年後回到C++,所以我還沒有很好的C和C++風格的感覺,但我正在努力。謝謝。 :) – 2008-12-08 16:27:43

2

雷默mber/proc/meminfo只是一個文件。打開文件,讀取第一行,關閉文件。瞧!

相關問題