完整刪除共享內存腳本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
上述各項含義以下:操作系統
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來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。