如何用 C++ 确定 Linux 系统 RAM 的大小?

2023-12-22

我刚刚编写了以下 C++ 函数来以编程方式确定系统安装了多少 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 文件的第一行。该命令的输出看起来像

内存总计:775280 kB

一旦我得到了输出istringstream,很容易将其标记化以获取我想要的信息。有没有更简单的方法来读取此命令的输出?是否有标准 C++ 库调用来读取系统 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),我建议采用 C++ 方法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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 C++ 确定 Linux 系统 RAM 的大小? 的相关文章

随机推荐

  • 如何将 Ruby 数组从 Heroku 控制台导出为 CSV?

    我希望将数组从 heroku 控制台导出到本地 CSV 文件中 在我目前的情况下 我每天都有一个 rake 任务 它寻找谈论我的应用程序的推文 我想分析这些推文 看看它们是什么时间出现的 等等 heroku run console twee
  • 录制视频时的音频音量

    因此 经过大量搜索后 我找到了允许在录制视频的同时播放背景音频的代码块 我已将所述代码块粘贴在下面 fileprivate func setBackgroundAudioPreference guard allowBackgroundAud
  • 枚举内的枚举

    我想在 java 中的 sql 查询的枚举中创建一个枚举 比如我想说table create它会返回 CREATE TABLE 或database create它会返回创建数据库 我怎样才能做到这一点 enum SQL table ALTE
  • 未找到 Phonegap 3.0 IOS 插件

    我在 XCode 中收到此错误 2013 08 23 14 36 18 284 Tell The DJ 14955 c07 ERROR Plugin Device not found or is not a CDVPlugin Check
  • 我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

    我可以执行以下操作吗 OperationContract WebGet UriTemplate foo id string GetFoo int id 我希望我的服务既可以作为 RESTful 服务 又可以作为 RPC 样式的 SOAP 服
  • 如何在C++中链接头文件

    我是使用头文件进行 C 编程的新手 这是我当前的代码 a h ifndef a H define a H namespace hello class A int a public void setA int x int getA endif
  • 如何在 Swift 中从文件夹中获取 UIImage 数组?

    我有一个像这样的普通 Xcode 项目 请注意 有一个名为 images 的文件夹 它是一个实际的文件夹 而不仅仅是一个组 它包含 25 个 png 图像 我想做的就是做一个array of UIimage与每一个图像 或者甚至是图像名称或
  • 使用 register_shutdown_function() 处理 PHP 中的致命错误

    根据对此答案的评论 https stackoverflow com questions 4409426 can i hook a method to my php file that if any page crashes should e
  • 模糊错误表明我的组件名称以零开头

    我收到一个晦涩的错误 我的组件名称为零 但我的组件中没有一个名称是零 这个错误很难追踪 任何人都知道问题可能是什么 这样我就可以朝着正确的方向前进来解决它 vendor js 66537 Vue warn 无效的组件名称 0 组件名称只能包
  • 无法将 Spring Security BASIC 身份验证集成到 Jersey/JAX-RS 和 Tomcat 中

    我正在尝试将 BASIC 身份验证添加到我使用 Jersey JAX RS 和 Tomcat Apache 7 0 创建的 RESTful Web 服务 将来我想在 WebSphere 上部署此 Web 服务 因此我选择在我的项目中使用 S
  • 优化大向量的操作

    这是我的后续行动上一个问题 https stackoverflow com questions 24278006 need advice on optimising haskell data processing关于处理 5 1m 边有向图
  • 自定义 HTML 插件创建 index.html 不影响

    我已经创建了这样的自定义 xhtml 插件 我的plugin xml代码是
  • 关于布局别名的 Android 文档不正确?

    我想弄清楚如何使用最少的样板代码重用或 别名 布局 看来关于布局别名的 Android 文档 http developer android com training multiscreen screensizes html TaskUseA
  • 带有 React useEffect 钩子的 componentWillUnmount

    怎样才能useEffect钩子 或任何其他与此相关的钩子 用于复制componentWillUnmount 在传统的类组件中我会做这样的事情 class Effect extends React PureComponent componen
  • StartPosition 设置为 CenterPosition 但我的表单未居中

    我正在使用 Visual Studio 2012 我的表单打开时不会以屏幕为中心 我有表格StartPosition set to CenterScreen 但它总是从我的左显示器的左上角开始 我有 2 个显示器 有任何想法吗 谢谢 试试这
  • 删除长度为 1 的 Julia 数组维度

    假设我有一个大小为 1024x1024x1x1x100 的 5D 数组 如何制作一个 1024x1024x100 的新数组 如果您提前知道要保留哪些维度 则以下操作有效 arr arr 1 1 But 我提前不知道哪些尺寸是多少我只想保留给
  • Databricks 笔记本挂着 pytorch

    我们遇到 Databricks 笔记本问题 我们的一个笔记本单元似乎挂起 而驱动程序日志确实显示该笔记本单元已被执行 有谁知道为什么我们的笔记本单元一直挂起并且无法完成 请参阅下面的详细信息 情况 我们正在训练 ML 模型pytorch在
  • 如何使用 Photoshop JavaScript 将文本写入文本文件?

    我看了一下Photoshop CS5 脚本编写指南和 Photoshop CS5 JavaScript 参考 http www adobe com devnet photoshop scripting html 但我找不到将文本写入纯文本文
  • 如何使用 TensorFlow 实现 k-means?

    介绍教程使用内置的梯度下降优化器 非常有意义 然而 k 均值不仅仅是我可以插入梯度下降中的东西 看起来我必须编写自己的优化器 但考虑到 TensorFlow 原语 我不太确定如何做到这一点 我应该采取什么方法 注 您现在可以获得这段代码的更
  • 如何用 C++ 确定 Linux 系统 RAM 的大小?

    我刚刚编写了以下 C 函数来以编程方式确定系统安装了多少 RAM 它有效 但在我看来应该有一种更简单的方法来做到这一点 我错过了什么吗 getRAM FILE stream popen head n1 proc meminfo r std