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?
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.
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 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With