Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you determine the amount of Linux system RAM in C++?

Tags:

c++

linux

ram

I just wrote the following C++ function to programmatically determine how much RAM a system has installed. It works, but it seems to me that there should be a simpler way to do this. Am I missing something?

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

First, I'm using popen("head -n1 /proc/meminfo") to get the first line of the meminfo file from the system. The output of that command looks like

MemTotal: 775280 kB

Once I've got that output in an istringstream, it's simple to tokenize it to get at the information I want. Is there a simpler way to read in the output of this command? Is there a standard C++ library call to read in the amount of system RAM?

like image 293
Bill the Lizard Avatar asked Dec 08 '08 15:12

Bill the Lizard


People also ask

How do I find out how much system memory I have?

Press Ctrl + Shift + Esc to launch Task Manager. Or, right-click the Taskbar and select Task Manager. Select the Performance tab to see current RAM usage displayed in the Memory box, and total RAM capacity listed under Physical Memory.


1 Answers

On Linux, you can use the function sysinfo which sets values in the following struct:

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

If you want to do it solely using functions of C++ (I would stick to sysinfo), I recommend taking a C++ approach using std::ifstream and 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 the rest of the line         file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');     }     return 0; // Nothing found } 
like image 106
Johannes Schaub - litb Avatar answered Sep 22 '22 05:09

Johannes Schaub - litb