unix/linux下的共享內存、信號量、隊列信息管理
在unix/linux下,經常有因爲共享內存、信號量,隊列等共享信息沒有乾淨地清楚而引起一些問題。
查看共享信息的內存的命令是ipcs [-m|-s|-q]。
默認會列出共享內存、信號量,隊列信息,-m列出共享內存,-s列出共享信號量,-q列出共享隊列
清除命令是ipcrm [-m|-s|-q] id。
-m 刪除共享內存,-s刪除共享信號量,-q刪除共享隊列。
清除命令是ipcrm [-m|-s|-q] id。
-m 刪除共享內存,-s刪除共享信號量,-q刪除共享隊列。
[oracle@trade_as02 ~]$ ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x30024289 32768 futures 777 528384 1
0xca2fd414 491521 oracle 640 1730150400 16
------ Semaphore Arrays --------
key semid owner perms nsems
0x00028009 0 futures 666 1
0x0002800c 32769 futures 666 1
0x30024003 262146 futures 777 3
0x3002428a 294915 futures 777 2
0x3002428b 327684 futures 777 2
0x3002428c 360453 futures 777 2
0x3002428d 393222 futures 777 2
0x3002428e 425991 futures 777 2
0x52dff7d0 3964936 oracle 640 151
0x52dff7d1 3997705 oracle 640 151
0x52dff7d2 4030474 oracle 640 151
0x52dff7d3 4063243 oracle 640 151
0x52dff7d4 4096012 oracle 640 151
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x30024289 32768 futures 777 528384 1
0xca2fd414 491521 oracle 640 1730150400 16
------ Semaphore Arrays --------
key semid owner perms nsems
0x00028009 0 futures 666 1
0x0002800c 32769 futures 666 1
0x30024003 262146 futures 777 3
0x3002428a 294915 futures 777 2
0x3002428b 327684 futures 777 2
0x3002428c 360453 futures 777 2
0x3002428d 393222 futures 777 2
0x3002428e 425991 futures 777 2
0x52dff7d0 3964936 oracle 640 151
0x52dff7d1 3997705 oracle 640 151
0x52dff7d2 4030474 oracle 640 151
0x52dff7d3 4063243 oracle 640 151
0x52dff7d4 4096012 oracle 640 151
------ Message Queues --------
key msqid owner perms used-bytes messages
共享內存段有時不能馬上刪除,需使用這個內存段的所有進程向OS發送detach命令時纔有釋放,此時可以考慮刪除進程使用的信號量,幫助釋放共享內存段
關鍵知識:信號量、資源釋放、ipcs、ipcrm
信號量又稱爲信號燈,它是用來協調不同進程間的數據對象的,而最主要的應用是共享內存方式的進程間通信。本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況;共享內存是運行在同一臺機器上的進程間通信最快的方式,因爲數據不需要在不同的進程間複製。通常由一個進程創建一塊共享內存區,其餘進程對這塊內存區進行讀寫。在Linux系統下 ,常用的方式是通過shmXXX函數族來實現利用共享內存進行存儲的。 如Shmget,類似於 malloc函數
相關知識:
ipcs可用來顯示當前Linux系統中的共享內存段、信號量集、消息隊列等的使用情況。
命令示例:
ipcs -a或ipc 顯示當前系統中共享內存段、信號量集、消息隊列的使用情況;
ipcs -m 顯示共享內存段的使用情況;
ipcs -s 顯示信號量集的使用情況;
ipcs -q 顯示消息隊列的使用情況;
ipcrm可用來刪除對應的共享內存段、信號量、消息隊列;
命令示例:
ipcrm -s semid 刪除對應的信號量集
ipcrm -m shmid 刪除對應的共享內存段
ipcrm -q msqid 刪除對應的消息隊列
ipcrm本身只能實現單個資源的刪除,利用以下命令可實現批量刪除(zhangsj版權所有,呵呵):
1.ipcs -s|grep 用戶名|cut -d" " -f2|xargs -n1 ipcrm -s
2.ipcs -s|awk '/用戶名/{print $2}'|xargs -n1 ipcrm -s
3.ipcs -s|awk '/用戶名/{system("ipcrm -s "$2)}'
4.for i in echo `ipcs|grep 用戶名|cut -d" " -f2`; do ipcrm -s $i; done
ipcs可用來顯示當前Linux系統中的共享內存段、信號量集、消息隊列等的使用情況。
命令示例:
ipcs -a或ipc 顯示當前系統中共享內存段、信號量集、消息隊列的使用情況;
ipcs -m 顯示共享內存段的使用情況;
ipcs -s 顯示信號量集的使用情況;
ipcs -q 顯示消息隊列的使用情況;
ipcrm可用來刪除對應的共享內存段、信號量、消息隊列;
命令示例:
ipcrm -s semid 刪除對應的信號量集
ipcrm -m shmid 刪除對應的共享內存段
ipcrm -q msqid 刪除對應的消息隊列
ipcrm本身只能實現單個資源的刪除,利用以下命令可實現批量刪除(zhangsj版權所有,呵呵):
1.ipcs -s|grep 用戶名|cut -d" " -f2|xargs -n1 ipcrm -s
2.ipcs -s|awk '/用戶名/{print $2}'|xargs -n1 ipcrm -s
3.ipcs -s|awk '/用戶名/{system("ipcrm -s "$2)}'
4.for i in echo `ipcs|grep 用戶名|cut -d" " -f2`; do ipcrm -s $i; done
source:http://dobzhu7781.spaces.live.com/blog/cns!4817887C779350C9!267.entry