共享内存的查看与释放

程序异常退出时没有释放共享内存,调试时出现错误,在网上搜了一下,在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等方式来发送中断信号结束程序,这个时候,程序申请的共享内存就不能得到释放,当然,如果程序没有改动的话,第二次重新运行程序时仍然会使用上次申请的内存。但是我们总希望每次程序结束就能释放掉申请的共享内存。
总结了一下,有如下两种方法:
第一种方法:
           如果你总是通过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   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                      

你可能感兴趣的:(LINUX)