我正在使用共享内存应用程序,要删除段我使用以下命令:
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
实际发生了什么?内存段真的被删除了吗?
编辑:问题是 - 如下面接受的答案所述 - 有两个进程使用共享内存,直到所有进程都关闭,内存段不会消失。
答案 0 :(得分:21)
我依旧记得从我的UNIX(AIX和HPUX,我承认我从来没有在Linux中使用过共享内存)这几天删除只是标记了新客户端无法再附加该块。
只有在没有附加进程的情况下,它才会在某个时刻被物理删除。
这与删除的常规文件相同,它们的目录信息被删除但文件内容仅在最后一个进程关闭后才会消失。这有时会导致日志文件占用文件系统上越来越多的空间,即使它们在进程仍在写入时被删除,这是文件指针之间“分离”的结果(零个或多个目录条目指向到inode)和文件内容(inode本身)。
您可以从ipcs
输出中看到,4个中的3个仍然附加了进程,因此在这些进程从共享内存块中分离之前,它们不会到达任何地方。另一个可能正在等待一些“扫描”功能来清理它,但这当然取决于共享内存的实现。
编写良好的共享内存客户端(或此类日志文件)应定期重新附加(或翻转),以确保此情况是暂时的,不会影响软件的运行。
答案 1 :(得分:12)
你说你使用了以下命令
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选项的行为与您观察到的完全相同,即设置仅在最后一次分离后销毁的段。