在使用共享記憶體的程式異常退出時,由於沒有釋放掉共享記憶體,在除錯時會出現錯誤。您可以使用shell命令來檢視與釋放已經分配的共享記憶體,下面將詳細說明如何進行檢視和釋放分配的共享記憶體的方法。
linux中通過api函式shmget建立的共享記憶體一般都是在程式中使用shmctl來釋放的,但是有時為了除錯程式,開發人員可能通過ctrl + c等方式傳送中斷訊號來結束程式,此時程式申請的共享記憶體就不能得到釋放,當然如果程式沒有改動的話,重新執行程式時仍然會使用上次申請的共享記憶體,但是如果我們修改了程式,由於共享記憶體的大小不一致等原因會導致程式申請共享記憶體錯誤。因此,我們總是希望每次結束時就能釋放掉申請的共享記憶體。
有兩種方法可以用來釋放共享記憶體:
第一種:如果總是通過crtl+c來結束的話,可以做乙個訊號處理器,當接收到這個訊號的時候,先釋放共享記憶體,然後退出程式。
第二種:不管你以什麼方式結束程式,如果共享記憶體還是得不到釋放,那麼可以通過linux命令ipcrm shm shmid來釋放,在使用該命令之前可以通過ipcs -m命令來檢視共享記憶體。
使用ipcs命令,不加如何引數時,會把共享記憶體、訊號量、訊息佇列的資訊都列印出來,如果只想顯示共享記憶體資訊,使用如下命令:
[root@localhost ~]# ipcs -m
------ shared memory segments --------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:第一列就是共享記憶體的key;
第二列是共享記憶體的編號shmid;
第三列就是建立的使用者owner;
第四列就是許可權perms;
第五列為建立的大小bytes;
第六列為連線到共享記憶體的程序數nattach;
第七列是共享記憶體的狀態status。其中顯示「dest」表示共享記憶體段已經被刪除,但是還有使用者在使用它,當該段記憶體的mode欄位設定為shm_dest時就會顯示「dest」。當使用者呼叫shmctl的ipc_rmid時,記憶體先檢視多少個程序與這個記憶體關聯著,如果關聯數為0,就會銷毀這段共享記憶體,否者設定這段記憶體的mod的mode位為shm_dest,如果所有程序都不用則刪除這段共享記憶體。
要釋放共享記憶體,需要使用ipcrm命令,使用shmid作為引數,shmid在ipcs命令中會有輸出,下面的命令可以釋放所有已經分片的共享記憶體:
# ipcrm
# ipcs -m | awk 『$2 ~/[0-9]+/ 』 | while read s; do sudo ipcrm –m $s; done
注:linux中vi使用ctrl+s來鎖定,需要使用ctrl+q來解除鎖定。
使用python編寫的rmsharemem.py指令碼如下:
# -*- coding: utf-8 -*-
# remove the share memory
import os
import sys
import getopt
def usage():
print "usage: python rmsharemem.py -h -o -s size "
print " -h show help information"
print " -o the owner create share memory need to delete"
print " -s the share memory size"
print " the shmid list need to delete"
def getsharemem():
sharemap = {}
fp = os.popen('ipcs -m')
lines = fp.readlines()
for l in lines:
if not l.startswith('0x'):
continue
s = l.split()
if sharemap.has_key(s[2]):
else:
sharemap[s[2]] = [s]
#print 'share memory map:\n', sharemap
return sharemap
if __name__ == "__main__":
opts, args = getopt.getopt(sys.argv[1:], "o:hs:")
# opts is the parameter with options
# args is the parameter no ptions
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 = raw_input("are you sure to remove all share memory?(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 'execute command: %s' % cmd
ret = os.system(cmd)
total += 1
if ret == 0:
count += 1
print 'remove %s shared memory success' % shmid
else:
print 'remove %s shared memory failed' % shmid
else:
shmmap = getsharemem()
for o, l in shmmap.items():
if owner and o <> owner:
continue
for p in l:
total += 1
if size and size <> p[4]:
continue
cmd = 'ipcrm -m %s' % p[1]
print 'execute command: %s' % cmd
ret = os.system(cmd)
if ret == 0:
count += 1
print 'remove %s shared memory success' % p[1]
else:
print 'remove %s shared memory failed' % p[1]
print 'total share memory number = %s' % total
print 'remove success number = %s' % count
sys.exit(0)
使用下面的命令檢視共享記憶體的大小:
# cat /proc/sys/kernel/shmmax
修改共享記憶體大小:
臨時修改:在root使用者下執行# echo 268435456 > /proc/sys/kernel/shmmax把共享記憶體大小設定為256mb;
永久修改:在root使用者下修改/etc/rc.d/rc.local檔案,加入下面一行:
echo 268435456 > /proc/sys/kernel/shmmax
即可每次啟動時把共享記憶體修改為256mb。
linux後台檢視共享記憶體和訊息佇列的命令
ipcs inter process communication show ipcs q 顯示所有的訊息佇列 ipcs qt 顯示訊息佇列的建立時間,傳送和接收最後一條訊息的時間 ipcs qp 顯示往訊息佇列中放訊息和從訊息佇列中取訊息的程序id ipcs q i msgid 顯示該訊息佇列結構體...
Linux 下檢視修改共享記憶體的方法
一 檢視共享記憶體大小 root使用者下 cat proc sys kernel shmmax就可以看到了。二 修改共享記憶體大小 1 臨時修改 root使用者下 echo 268435456 proc sys kernel shmmax 把共享記憶體大小修改為256m 因為256 1024 102...
檢視ipc資源情況及其刪除共享記憶體命令
檢視ipc資源 訊息佇列 共享記憶體 訊號量 使用ipcs命令其使用的方法如下 ipcs a s q m i id預設的情況直接使用 a,會列印出所有的資訊,需要檢視訊號量使用 s,訊息佇列使用 q,共享記憶體 m。這裡我建立了乙個訊號量,我在建立的時候配置錯了引數,我想修改的我屬性,但是我不想修改...