關於linux 共享內存查看已經完整釋放

完整刪除共享內存腳本bash

#!/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)信息this

 
共享內存輸出.png

上述各項含義以下:操作系統

  1. key:表示共享內存的key
  2. shmid:表示共享內存編號
  3. owner:表示建立共享內存的用戶
  4. perms:表示共享內存的的使用權限
  5. bytes:表示共享內存的大小
  6. nattch:表示鏈接到共享內存的的進程數
  7. 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,若是全部進程都不用則刪除這段共享內存。3d

做者:blue_smile連接:https://www.jianshu.com/p/04ee6fae9a3d來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索