在 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 删除共享内存的主要内容,如果未能解决你的问题,请参考以下文章