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

24

我正在处理一个共享内存应用程序,为了删除这些段,我使用以下命令:

 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

到底发生了什么?内存段真的被删除了吗?

编辑: 如下所述,问题在于有两个进程正在使用共享内存,直到所有进程都关闭后,内存段才会消失。

2个回答

25

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

只有在没有任何进程连接到它后,它才会在某个时间点上被物理删除。

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

您可以从您的ipcs输出中看到,其中3个仍然有连接的进程,因此除非这些进程从共享内存块中分离,否则它们将无处可去。另一个可能正在等待某个“扫描”功能来清理它,但这当然取决于共享内存实现。

良好编写的共享内存客户端(或日志文件)应定期重新附加(或滚动)以确保这种情况是短暂的,并且不影响软件的操作。


14

你说你使用了以下命令:

ipcrm -M 0x0000162e (这是密钥)

从ipcrm的man手册中得到如下信息:

 -M shmkey
         Mark the shared memory segment associated with key shmkey for
         removal.  This marked segment will be destroyed after the
         last detach.
因此,-M选项的行为正如您观察到的那样,即仅在最后一个分离之后将段设置为待销毁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接