【问题标题】:How to know the available size of the shared memory that is used by `shm_open` in C++?如何知道 C++ 中 `shm_open` 使用的共享内存的可用大小?
【发布时间】:2020-10-23 07:09:06
【问题描述】:

我正在使用 boost 库为我的 C++ 程序开发 IPC,我发现如果我请求的内存大小大于其容量,boost::shared_memory_object 不会引发任何错误。这个问题在堆栈溢出时至少被问过两次:

Why I can create a shared memory bigger than the size mounted on /dev/shm using POSIX?

How to get information about free memory from /dev/shm

正如第一个问题的答案所说,没有直接的方法可以确保您不会耗尽共享内存。我唯一的选择是在请求共享内存之前检查可用内存大小。但是,从问题

how do i change the shm_open path?

一个答案说共享内存的目录可以是/dev/shm/var/run/shm(或者我猜的任何其他内容)。通过查看shm_overview,我们还可以确认/dev/shm 不是唯一的路径,它只是常规路径。所以我的问题是:鉴于我们不确定shm_open 正在使用的共享内存的目录,我们如何知道 Linux 上共享内存的可用大小?

任何建议将不胜感激。

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    如果你想要一个仅限于 glibc 的非便携式解决方案,你可以作弊并查看 glibc 的来源。

    shm_open: https://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html#shm_open

    调用此函数以获取基本路径: https://code.woboq.org/userspace/glibc/sysdeps/posix/shm-directory.c.html

    这是一种硬编码,似乎不可配置。

    但至少你可以自己调用它:

    #include <stdio.h>
    extern "C" const char *__shm_directory (size_t *len);
    int main() {
        size_t idontcare;
        puts(__shm_directory(&idontcare));
    }
    

    (用-lpthread编译)

    然后你可以检查那里的可用空间。

    【讨论】:

    • 谢谢!这是我的问题的一个很好的解决方案。即使它不是便携式的,但我会接受它,因为我们没有更好的选择。糟糕的 POSIX API...
    猜你喜欢
    • 2014-12-24
    • 2014-03-17
    • 2021-10-03
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多