在使用共享內存的程序異常退出時,由于沒有釋放掉共享內存,在調試時會出現錯誤。您可以使用shell命令來查看與釋放已經分配的共享內存,下面將詳細說明如何進行查看和釋放分配的共享內存的方法。
預備知識
Linux中通過API函數創建的共享內存一般都是在程序中使用來釋放的,但是有時為了調試程序,開發人員可能通過 Ctrl + C等方式發送中斷信號來結束程序,此時程序申請的共享內存就不能得到釋放,當然如果程序沒有改動的話,重新運行程序時仍然會使用上次申請的共享內存,但是 如果我們修改了程序,由于共享內存的大小不一致等原因會導致程序申請共享內存錯誤。因此,我們總是希望每次結束時就能釋放掉申請的共享內存。
有兩種方法可以用來釋放共享內存:
第一種:如果總是通過Crtl+C來結束的話,可以做一個信號處理器,當接收到這個信號的時候,先釋放共享內存,然后退出程序。
第二種:不管你以什么方式結束程序,如果共享內存還是得不到釋放,那么可以通過linux命令ipcrm shm shmid來釋放,在使用該命令之前可以通過ipcs -m命令來查看共享內存。
共享內存查看
使用ipcs命令,不加如何參數時,會把共享內存、信號量、消息隊列的信息都打印出來,如果只想顯示共享內存信息linux查看信號量命令,使用如下命令:
[root@ ~]# ipcs -m
------ --------
key shmid owner perms bytes
root 600 2 dest
root 600 2 dest
zc 666 1
zc 666 1
zc 666 1
zc 666 1
root 600 2 dest
root 600 2 dest
root 600 2 dest
root 600 2 dest
root 600 2 dest
cs 666 2
root 600 2 dest
root 600 2 dest
root 666 1
其中:
第一列就是共享內存的key;
第二列是共享內存的編號shmid;
第三列就是創建的用戶owner;
第四列就是權限perms;
第五列為創建的大小bytes;
第六列為連接到共享內存的進程數;
第七列是共享內存的狀態。其中顯示“dest”表示共享內存段已經被刪除,但是還有用戶在使用它,當該段內存的mode字段設置為 時就會顯示“dest”。當用戶調用的時,內存先查看多少個進程與這個內存關聯著,如果關聯數為0,就會銷 毀這段共享內存,否者設置這段內存的mod的mode位為,如果所有進程都不用則刪除這段共享內存。
共享內存釋放
要釋放共享內存,需要使用ipcrm命令,使用shmid作為參數,shmid在ipcs命令中會有輸出,下面的命令可以釋放所有已經分片的共享內存:
# ipcrm
# ipcs -m | awk ‘$2 ~/[0-9]+/ {print $2}’ | while read s; do sudo ipcrm –m $s; done
注:Linux中vi使用Ctrl+s來鎖定linux查看信號量命令,需要使用Ctrl+q來解除鎖定。
使用編寫的.py腳本如下:
# -*- : utf-8 -*-
# the share
os
sys
def usage():
print "usage: .py -h -o -s size "
print " -h show help "
print " -o the owner share need to "
print " -s the share size"
print " the shmid list need to "
def ():
= {}
fp = os.popen('ipcs -m')
lines = fp.()
for l in lines:
if not l.('0x'):
s = l.split()
if .(s[2]):
[s[2]].(s)
else:
[s[2]] = [s]
#print 'Share map:',
if == "":
opts, args = .(sys.argv[1:], "o:hs:")
# opts is the with
# args is the no
owner = None
size = 0
for o, p in opts:
if o == '-h':
usage()
sys.exit(0)
elif o == '-o':
owner = p
elif o == '-s':
size = p
if not owner:
val = ("Are you sure to all share ?(yes/no)");
if (val "yes"):
usage()
sys.exit(0)
count = 0
total = 0
if len(args) > 0:
for shmid in args:
cmd = 'ipcrm -m %s' % shmid
print ' : %s' % cmd
ret = os.(cmd)
total += 1
if ret == 0:
count += 1
print ' %s ' % shmid
else:
print ' %s ' % shmid
else:
= ()
for o, l in .items():
if owner and o owner:
for p in l:
total += 1
if size and size p[4]:
cmd = 'ipcrm -m %s' % p[1]
print ' : %s' % cmd
ret = os.(cmd)
if ret == 0:
count += 1
print ' %s ' % p[1]
else:
print ' %s ' % p[1]
print 'total share = %s' % total
print ' = %s' % count
sys.exit(0)
共享內存大小修改
使用下面的命令查看共享內存的大小:
# cat /proc/sys//
修改共享內存大小:
臨時修改:在root用戶下執行# echo > /proc/sys//把共享內存大小設置為256MB;
永久修改:在root用戶下修改/etc/rc.d/rc.local文件,加入下面一行:
echo > /proc/sys//
即可每次啟動時把共享內存修改為256MB。