程序异常退出时没有释放共享内存,调试时出现错误,在网上搜了一下,在shell中是可以查看与释放已分配的共享内存的。
查看共享内存,使用ipcs命令,不加任何参数时,这条命令会把共享内存/信号量/消息队列的信息都打印出来。如果只想显示共享内存信息,则使用ipcs -m。
要删除共享内存,需要使用ipcrm命令,使用shmid做为参数。shmid在ipcs命令中会有输出。
下面的命令可以释放所有已分配的共享内存:
ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done
Linux中通过API函数shmget创建的共享内存一般都是在程序中通过shmctl来释放的,但是有时为了调试程序,开发人员可能通过ctrl + c等方式来发送中断信号结束程序,这个时候,程序申请的共享内存就不能得到释放,当然,如果程序没有改动的话,第二次重新运行程序时仍然会使用上次申请的内存。但是我们总希望每次程序结束就能释放掉申请的共享内存。
总结了一下,有如下两种方法:
第一种方法:
第二种方法:
当然,提到释放共享内存的ipcrm命令,我们不得不提到了查看共享内存的ipcs命令
[root@cucme venus]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00001f11 2097152 root 0 7500000 0
0x00001f21 2129921 root 0 7500000 0
0x00001f31 2162690 root 0 7500000 0
0x00001f26 2195459 root 0 7500000 0
0x00001f16 2228228 root 0 7500000 0
0x00001f17 2260997 root 0 7500000 0
0x00001f27 2293766 root 0 7500000 0
0x00001f37 2326535 root 0 7500000 0
0x00001f28 2359304 root 0 7500000 0
0x00001f56 2392073 root 0 7500000 0
------ Shared Memory Segments --------
key
0x00001f11 2097152
0x00001f21 2129921
0x00001f31 2162690
0x00001f26 2195459
0x00001f16 2228228
0x00001f17 2260997
0x00001f27 2293766
0x00001f37 2326535
0x00001f28 2359304
0x00001f56 2392073
既然ipcs能够查看共享内存的信息,而且输出项包含了释放共享内存时要用的标识符,即就是第二列“shmid”,所以我们可以在一个脚本文件中结合ipcs和ipcrm命令来完成对共享内存的释放。
要释放共享内存,你需要执行如下命令:
ipcrm shm memid
上句释放标识符为memid的共享内存,如果我们要释放所有的共享内存,只需要取出所有共享内存的ID,然后挨个ipcrm就行了,下面的程序正表达了此种方法的具体行为,经过我的测试,可以成功共释放共享内存:
#########shut.sh#########
#author:duanjigang@2008-02-19 duanjigang1983@126.com
#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
cat out | while read shid
do
done
rm -fr out
要释放共享内存,只需要执行 sh shut.sh就行了