Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5224712
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: LINUX

2008-07-07 17:33:21

批量释放系统共享内存 
 Linux中通过API函数shmget创建的共享内存一般都是在程序中通过shmctl来释放的,但是有时为了调试程序,开发人员可能通过ctrl + c等方式来发送中断信号结束程序,这个时候,程序申请的共享内存就不能得到释放,当然,如果程序没有改动的话,第二次重新运行程序时仍然会使用上次申请的内存。但是我们总希望每次程序结束就能释放掉申请的共享内存。
总结了一下,有如下两种方法:
第一种方法:
           如果你总是通过ctrl+c来结束程序的话,可以做一个信号处理器,当收到这个信号时,先释放共享内存,然后退出程序。这种方法原理上应该是可行的,但是我还没做具体的实验。
第二种方法:
          不管你通过什么方法结束了程序,如果共享内存还未得到是啊发那个,我们可以通过Linux的命令ipcrm shm shmid来释放。
当然,提到释放共享内存的ipcrm命令,我们不得不提到了查看共享内存的ipcs命令
[root@cucme venus]# ipcs -m
------ Shared Memory Segments --------
key       shmid    owner  perms  bytes   nattch  status     
0x00001f11 2097152  root       7500000                        
0x00001f21 2129921  root       7500000                        
0x00001f31 2162690  root       7500000                        
0x00001f26 2195459  root       7500000                        
0x00001f16 2228228  root       7500000                        
0x00001f17 2260997  root       7500000                        
0x00001f27 2293766  root       7500000                        
0x00001f37 2326535  root       7500000                        
0x00001f28 2359304  root       7500000                        
0x00001f56 2392073  root       7500000    0
既然ipcs能够查看共享内存的信息,而且输出项包含了释放共享内存时要用的标识符,即就是第二列“shmid”,所以我们可以在一个脚本文件中结合ipcs和ipcrm命令来完成对共享内存的释放。
要释放共享内存,你需要执行如下命令:
ipcrm shm memid
上句释放标识符为memid的共享内存,如果我们要释放所有的共享内存,只需要取出所有共享内存的ID,然后挨个ipcrm就行了,下面的程序正表达了此种方法的具体行为,经过我的测试,可以成功共释放共享内存:
#########shut.sh#########
#desp: scripts for releasing share memories
ipcs -m | awk '{if($2~/^[0-9]+$/)print $2}'  > out
cat out | while read shid
do
  ipcrm shm $shid
done
rm -fr out
要释放共享内存,只需要执行 sh shut.sh就行了
阅读(806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~