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