在 Linux 中使用 ipcrm 删除共享内存

Posted

技术标签:

【中文标题】在 Linux 中使用 ipcrm 删除共享内存【英文标题】:Deleting shared memory with ipcrm in Linux 【发布时间】:2010-09-28 18:32:06 【问题描述】:

我正在使用共享内存应用程序,要删除段,我使用以下命令:

 ipcrm -M 0x0000162e (this is the key)

但我不知道我是否做对了,因为当我运行ipcs 时,我看到了相同的段,但密钥为 0x0000000。那么内存段真的被删除了吗?当我多次运行我的应用程序时,我会看到键为 0x000000 的不同内存段,如下所示:

 key        shmid      owner      perms      bytes      nattch     status
 0x00000000 65538      me         666        27         2          dest 
 0x00000000 98307      me         666        5          2          dest 
 0x00000000 131076     me         666        5          1          dest
 0x00000000 163845     me         666        5          0

实际发生了什么?内存段真的被删除了吗?

编辑: 问题是 - 正如下面接受的答案中所说 - 有两个进程使用共享内存,直到所有进程都关闭,内存段不会消失。

【问题讨论】:

【参考方案1】:

我隐约记得在我的 UNIX(AIX 和 HPUX,我承认我从未在 Linux 中使用过共享内存)的日子里,删除只是将块标记为不再可被新客户端附加。

只有在没有附加进程后,它才会被物理删除。

这与删除的常规文件相同,它们的目录信息被删除,但文件的内容只有在最后一个进程关闭后才会消失。这有时会导致日志文件在文件系统上占用越来越多的空间,即使它们被删除,因为进程仍在写入它们,这是文件指针之间“分离”的结果(零个或多个目录条目指向到一个 inode)和文件内容(inode 本身)。

您可以从ipcs 输出中看到,4 个中的 3 个仍然有附加的进程,因此在这些进程与共享内存块分离之前,它们不会去任何地方。另一个可能正在等待一些“扫描”函数来清理它,但这当然取决于共享内存的实现。

编写良好的共享内存客户端(或日志文件)应定期重新附加(或翻转)以确保这种情况是暂时的并且不会影响软件的运行。

【讨论】:

【参考方案2】:

你说你使用了下面的命令

ipcrm -M 0x0000162e (this is the key)

来自 ipcrm 的手册页

 -M shmkey
         Mark the shared memory segment associated with key shmkey for
         removal.  This marked segment will be destroyed after the
         last detach.

所以 -M 选项的行为与您观察到的完全一样,即将段设置为仅在最后一次分离后销毁。

【讨论】:

以上是关于在 Linux 中使用 ipcrm 删除共享内存的主要内容,如果未能解决你的问题,请参考以下文章

ipcs命令

检查linux中消息队列和共享内存状态的命令?

工作中常用的Linux命令:ipcs/ipcrm命令

查看 共享内存 的命令 ipcrmipcs

Linux IPC基础

Linux之进程间通信