当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在Linux中使用ipcrm删除共享内存》经验,为你挑选了2个好方法。

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

 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> paxdiablo..:

我依旧记得从我的UNIX(AIX和HPUX,我承认我从来没有在Linux中使用过共享内存)这几天删除只是标记块不再可以被新客户连接.

只有在没有附加进程的情况下,它才会在某个时刻被物理删除.

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

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

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



2> hhafez..:

你说你使用了以下命令

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选项的行为完全符合您的观察,即设置仅在最后一次分离后销毁的段.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有