你如何确定C ++中的Linux系统RAM的数量?

我只写了下面的C ++函数来编程确定一个系统已经安装了多lessRAM。 它工作,但在我看来,应该有一个更简单的方法来做到这一点。 有人可以告诉我,如果我错过了什么吗?

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的数量?

Solutions Collecting From Web of "你如何确定C ++中的Linux系统RAM的数量?"

在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 ),我建议使用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 } 

没有必要使用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; } 

记住/ proc / meminfo只是一个文件。 打开文件,读取第一行,关闭文件。 瞧!

甚至top (从procps )解析/proc/meminfo ,看到这里 。