我可以用shmctl调整Linux共享内存的大小吗? 我有一个C++应用程序,它通过SMGET(2)在Linux系统上分配共享内存。我存储在共享内存中的数据会周期性增长,我希望以类似于realloc()增长常规内存的方式调整共享内存的大小。有办法做到这一点吗?我在IBM的网站上找到一个文档,其中提到了SHM_SIZE命令,但Linux和BSD手册页中没有它,甚至在Linux特定的部分中也没有。

我可以用shmctl调整Linux共享内存的大小吗? 我有一个C++应用程序,它通过SMGET(2)在Linux系统上分配共享内存。我存储在共享内存中的数据会周期性增长,我希望以类似于realloc()增长常规内存的方式调整共享内存的大小。有办法做到这一点吗?我在IBM的网站上找到一个文档,其中提到了SHM_SIZE命令,但Linux和BSD手册页中没有它,甚至在Linux特定的部分中也没有。,c++,linux,shared-memory,C++,Linux,Shared Memory,在我看来,您可以为自己的目的编写自己的内存管理器。这个概念很简单: 您有一个大小为N字节的共享内存块 分配大小为2*N的新共享内存块 将内存从一个块复制到另一个块 释放旧的共享内存块 将#2-4包装成一些常规并使用它 恐怕我们与此无关。这就是std::vector的实现方式。在大多数情况下,void*realloc()将返回指向新内存块(但不指向扩展的旧内存块)的指针 简单的答案是:没有简单的方法 原因是相当合乎逻辑的。共享内存分别连接到每个进程的虚拟空间。每个进程都有自己的虚拟地址空间。每个进

在我看来,您可以为自己的目的编写自己的内存管理器。这个概念很简单:

  • 您有一个大小为
    N
    字节的共享内存块
  • 分配大小为
    2*N
    的新共享内存块
  • 将内存从一个块复制到另一个块
  • 释放旧的共享内存块
  • 将#2-4包装成一些常规并使用它
    恐怕我们与此无关。这就是
    std::vector
    的实现方式。在大多数情况下,
    void*realloc()
    将返回指向新内存块(但不指向扩展的旧内存块)的指针

    简单的答案是:没有简单的方法

    原因是相当合乎逻辑的。共享内存分别连接到每个进程的虚拟空间。每个进程都有自己的虚拟地址空间。每个进程都可以在任意地址(不是字面意思,对齐设置了一些限制)自由附加段。系统如何保证,比如说,通过将面积扩大4MiB,该段的每个“用户”将能够在较小段之前所在的相同起始地址安装bigget block

    但你不应该放弃你可以有创造力。您可以想到使用一个头段,在其中存储关于实际有效负载段的信息。您可以使每个进程遵守一些规则,例如:当其id(如标题段中的某个地方所述)与已知id不匹配时,重新附加有效负载段

    建议:我怀疑您知道这一点,但是永远不要保留指向共享区域内数据的指针,只保留偏移量


    我希望你能利用我的胡言乱语。

    在我看来,函数mremap的实现是为了执行你想要的。 您只需在参数中精确计算共享内存段的旧大小和新大小。如果添加标志MREMAP_MAYMOV,它允许在需要时移动共享内存段(即,如果旧共享内存段后面没有足够的可用空间)


    查看手册:。

    我相信这样做会使这种类型的内存的“共享”属性不存在。作为灵感,请看:-特别是
    管理的\u共享的\u内存
    ,它可以用来在共享内存中保存
    向量
    …谢谢-这非常有用!