完整删除共享内存脚本

#!/bin/sh

function rmshm()
{
zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l`
if [ $zero_status -eq 0 ];then
echo "Warnning: not status eq 0 shmid,exitting........"
return 0
fi
get_shmid=`ipcs -m|grep -w 0|awk '{print $2}'`
for i in $get_shmid
do
get_pid=`ipcs -p|grep $i|awk '{print $4}'`
get_pids=`ps -ef|grep -v "grep"|grep $get_pid|wc -l`
if [ $get_pids -eq 0 ];then
echo "info: delete shmid $i...."
ipcrm -m $i
else
echo "info: this shmid $i use ;"
return 0
fi
done
echo "info: Delete sucess"
return 0
} rmshm

  

ipcs -m:输出所有共享内存(share memory)信息

 
共享内存输出.png

上述各项含义如下:

  1. key:表示共享内存的key
  2. shmid:表示共享内存编号
  3. owner:表示创建共享内存的用户
  4. perms:表示共享内存的的使用权限
  5. bytes:表示共享内存的大小
  6. nattch:表示连接到共享内存的的进程数
  7. status:表示共享的状态(不显示则为正常使用,显示“dest”表示共享内存已被删除,但仍有用户使用)
备注:这里简单解释一下为什么会出现“dest”这个状态

Linux下删除任何内容,都会先检查一下这个内容的引用计数(就是文件的使用数,n个进程使用,引用计数为n)。若引用计数为0,就会真正的删除该内容(这里就是删除共享内存)。不为0,表示仍有进程使用,则正在使用的进程可以正常使用,直至引用计数降为0后,系统才会将该内容真正意义上的删除掉。
对这里用共享内存来说同理,显示“dest”是表示该共享内存已经被删除但有进程还在使用它。这时操作系统将共享内存的mode标记为SHM_DEST,key标记为0x00000000,并对外显示status为“dest”。当用户调用shmctl的IPC_RMID时,系统会先查看这个共享内存的引用计数,如果引用计数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。


作者:blue_smile
链接:https://www.jianshu.com/p/04ee6fae9a3d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. 011商城项目:图片服务器的安装---nginx
  2. 实际项目中的一个angularjs 应用
  3. iOS6、7、8、9新特性汇总和适配说明
  4. ReportViewer报表
  5. TableView使用CATransform3D特效动画
  6. 05_最长公共子序列问题(LCS)
  7. NSBundle UIImageView &UIButton
  8. 一次JQuery性能优化实战
  9. ArcGIS 坐标系统文件
  10. HDU 5433 Xiao Ming climbing
  11. linux0.11文件分析
  12. Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析
  13. jquery.validate.js 一个jQuery验证格式控件
  14. ScrollView嵌套ListView显示不完全、嵌套TextView不能滚动解决办法
  15. Spring MVC 学习笔记一 HelloWorld
  16. js验证表单密码、用户名是否输入--JS的简单应用
  17. QEMU KVM Libvirt手册(9): network
  18. 使用PHP添加圆形头像
  19. android layout文件优化
  20. 设计模式 工厂模式 使用shared_ptr

热门文章

  1. js的call和apply区别
  2. flex布局设置width无效
  3. Xshell配置使用linux的图形界面
  4. md 常用语法
  5. js设置radio单选框值选中
  6. angular ,require.js, angular-async-loader实现单页面路由,控制器js文件分离
  7. org.hibernate.ObjectNotFoundException: No row with the given identifier exists
  8. UVa LA 4636 Cubist Artwork 难度: 0
  9. shell脚本实现git和svn统计log代码行
  10. error: `cout' was not declared in this scope