ipcs是Linux下顯示進程間通信設(shè)施狀態(tài)的工具。可以顯示消息隊列、共享內(nèi)存和信號量的信息。對于程序員非常有用,普通的系統(tǒng)管理員一般用不到此指令。
$ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 229376 weber 600 1
------ Message Queues --------
key msqid owner perms used-bytes messages
分別查詢IPC資源
$ipcs -m 查看系統(tǒng)使用的IPC共享內(nèi)存資源
$ipcs -q 查看系統(tǒng)使用的IPC隊列資源
$ipcs -s 查看系統(tǒng)使用的IPC信號量資源
示例:有個IPCKEY(51036),需要查詢其是否被占用;
51036 -> c75c
$ipcs -m | grep c75c
0x0000c75c 40403197 tdea3 666 536870912 2
$ipcs | grep c75c
0x0000c75c 40403197 tdea3 666 536870912 2
0x0000c75c 5079070 tdea3 666 4
ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 2048
max size of message (bytes) = 524288
default max size of queue (bytes) = 5242880
以上輸出顯示,目前這個系統(tǒng)的允許的最大內(nèi)存為1073741824kb;最大可使用128個信號量,每個消息的最大長度為524288bytes;
以linux系統(tǒng)為例,在root用戶下修改/etc/sysctl.conf 文件,保存后使用sysctl -p生效
$cat /etc/sysctl.conf
# 一個消息的最大長度
kernel.msgmax = 524288
# 一個消息隊列上的最大字節(jié)數(shù)
# 524288*10
kernel.msgmnb = 5242880
#最大消息隊列的個數(shù)
kernel.msgmni=2048
#一個共享內(nèi)存區(qū)的最大字節(jié)數(shù)
kernel.shmmax = 17179869184
#系統(tǒng)范圍內(nèi)最大共享內(nèi)存標(biāo)識數(shù)
kernel.shmmni=4096
#每個信號燈集的最大信號燈數(shù) 系統(tǒng)范圍內(nèi)最大信號燈數(shù) 每個信號燈支持的最大操作數(shù) 系統(tǒng)范圍內(nèi)最大信號燈集數(shù)
#此參數(shù)為系統(tǒng)默認(rèn),可以不用修改
#kernel.sem = <semmsl> <semmni>*<semmsl> <semopm> <semmni>
kernel.sem = 250 32000 32 128
顯示輸入不帶標(biāo)志的 ipcs:的輸出
$ipcs
IPC status from /dev/mem as of Mon Aug 14 15:03:46 1989
T ID KEY MODE OWNER GROUP
Message Queues:
q 0 0x00010381 -Rrw-rw-rw- root system
q 65537 0x00010307 -Rrw-rw-rw- root system
q 65538 0x00010311 -Rrw-rw-rw- root system
q 65539 0x0001032f -Rrw-rw-rw- root system
q 65540 0x0001031b -Rrw-rw-rw- root system
q 65541 0x00010339--rw-rw-rw- root system
q 6 0x0002fe03 -Rrw-rw-rw- root system
Shared Memory:
m 65537 0x00000000 DCrw------- root system
m 720898 0x00010300 -Crw-rw-rw- root system
m 65539 0x00000000 DCrw------- root system
Semaphores:
s 131072 0x4d02086a --ra-ra---- root system
s 65537 0x00000000 --ra------- root system
s 1310722 0x000133d0 --ra------- 7003 30720
使用ipcrm 命令來清除IPC資源:這個命令同時會將與ipc對象相關(guān)聯(lián)的數(shù)據(jù)也一起移除。當(dāng)然,只有root用戶,或者ipc對象的創(chuàng)建者才有這項權(quán)利;
ipcrm用法
ipcrm -M shmkey 移除用shmkey創(chuàng)建的共享內(nèi)存段
ipcrm -m shmid 移除用shmid標(biāo)識的共享內(nèi)存段
ipcrm -Q msgkey 移除用msqkey創(chuàng)建的消息隊列
ipcrm -q msqid 移除用msqid標(biāo)識的消息隊列
ipcrm -S semkey 移除用semkey創(chuàng)建的信號
ipcrm -s semid 移除用semid標(biāo)識的信號
清除當(dāng)前用戶創(chuàng)建的所有的IPC資源
ipcs -q | awk '{ print "ipcrm -q "$2}' | sh > /dev/null 2>&1;
ipcs -m | awk '{ print "ipcrm -m "$2}' | sh > /dev/null 2>&1;
ipcs -s | awk '{ print "ipcrm -s "$2}' | sh > /dev/null 2>&1;
$ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x49060005 58261504 user1 660 0 0
0x4f060005 58294273 user1 660 0 0
...
$ ipcs -q |grep user1 |awk '{if($5>0) print $0}'
0x00000000 1071579324 user1 644 1954530 4826
0x00000000 1071644862 user1 644 1961820 4844
0x00000000 1071677631 user1 644 1944810 4802
0x00000000 1071710400 user1 644 1961820 4844