完整刪除共享內存腳本
#!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ $zero_status -eq 0 ];then echo "Warnning: not status eq 0 shmid,exitting........" return 0 fi get_shmid=`ipcs -m|grep -w 0|awk '{print $2}'` for i in $get_shmid do get_pid=`ipcs -p|grep $i|awk '{print $4}'` get_pids=`ps -ef|grep -v "grep"|grep $get_pid|wc -l` if [ $get_pids -eq 0 ];then echo "info: delete shmid $i...." ipcrm -m $i else echo "info: this shmid $i use ;" return 0 fi done echo "info: Delete sucess" return 0 } rmshm
ipcs -m:輸出所有共享內存(share memory)信息

共享內存輸出.png
上述各項含義如下:
- key:表示共享內存的key
- shmid:表示共享內存編號
- owner:表示創建共享內存的用戶
- perms:表示共享內存的的使用權限
- bytes:表示共享內存的大小
- nattch:表示連接到共享內存的的進程數
- status:表示共享的狀態(不顯示則為正常使用,顯示“dest”表示共享內存已被刪除,但仍有用戶使用)
備注:這里簡單解釋一下為什么會出現“dest”這個狀態
Linux下刪除任何內容,都會先檢查一下這個內容的引用計數(就是文件的使用數,n個進程使用,引用計數為n)。若引用計數為0,就會真正的刪除該內容(這里就是刪除共享內存)。不為0,表示仍有進程使用,則正在使用的進程可以正常使用,直至引用計數降為0后,系統才會將該內容真正意義上的刪除掉。
對這里用共享內存來說同理,顯示“dest”是表示該共享內存已經被刪除但有進程還在使用它。這時操作系統將共享內存的mode標記為SHM_DEST,key標記為0x00000000,並對外顯示status為“dest”。當用戶調用shmctl的IPC_RMID時,系統會先查看這個共享內存的引用計數,如果引用計數為0,就會銷毀這段共享內存,否者設置這段內存的mod的mode位為SHM_DEST,如果所有進程都不用則刪除這段共享內存。
作者:blue_smile
鏈接:https://www.jianshu.com/p/04ee6fae9a3d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。