2008-12-08 7 views
19

Я просто написал следующую функцию C++, чтобы программно определить, сколько оперативной памяти установлена ​​системой. Это работает, но мне кажется, что должен быть более простой способ сделать это. Может ли кто-нибудь сказать мне, если я что-то упустил?Как определить объем оперативной памяти Linux в C++?

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 кБ

После того, как я получил этот выход в istringstream, это просто разметить его, чтобы получить в информации, которую я хочу. Мой вопрос в том, есть ли более простой способ прочитать в выходе этой команды? Существует ли стандартный вызов библиотеки C++ для чтения в объеме системной памяти?

ответ

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 */ 
    }; 

Если вы хотите сделать это только с помощью функции с ++ (я бы придерживаться sysinfo), я рекомендую принимать подход C++ с использованием std::ifstream и std::string:

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

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

Reme mber/proc/meminfo - это всего лишь файл. Откройте файл, прочитайте первую строку, закройте файл. Вуаля!

Смежные вопросы