在Linux进程通信中,共享内存的应用是比较普遍,把自己学习过的资料作一个小结吧!
共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。
注意:在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
简单解释一下ipcs命令和ipcrm命令。
取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
%ipcs -m
删除ipc
ipcrm -m|-q|-s shm_id
%ipcrm -m 105
---------------------------------
共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因其速度最快、效率最高,被广泛应用于各类软件产品及应用开发中。System V IPC 为UNIX平台上的共享内存应用制定了统一的API标准,从而为在UNIX/Linux平台上进行跨平台开发提供了极大的便利;开发人员基于一套基本相同的源代码,便可开发出同时支持AIX、Solaris、HP-UX、Linux等平台的产品。
$ ipcs -ma
IPC status from /dev/mem as of Thu Jul 17 08:48:39 BEIST 2014
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
Shared Memory:
m 0 0x5800120c --rw-rw-rw- root system root system 1 134217728 19838 32766 14:08:54 14:08:54 14:08:54
m 131073 0x16fd87e8 --rw-r----- oracle dba oracle dba 9 218415104 49796 64370 8:48:29 8:48:29 14:10:02
m 131074 0x78054448 --rw-r----- oracle dba oracle dba 6 106184704 46206 82892 1:40:19 1:40:19 14:09:54
m 131075 0xffffffff --rw-rw---- root system root system 1 4096 43874 43874 8:48:22 8:48:22 14:09:52
m 4 0x6953e7d8 --rw-r----- oracle dba oracle dba 9 303316992 54184 64436 1:37:49 1:37:49 14:10:08
m 5 0x47f35784 --rw-r----- oracle dba oracle dba 9 504643584 59096 78314 1:35:18 1:35:18 14:10:22
m 6 0xffffffff --rw------- root system root system 0 268435456 62182 62182 14:10:31 9:01:06 14:10:31
m 262151 0xffffffff --rw------- root system root system 1 268435456 79010 79010 9:01:47 no-entry 9:01:47
m 8 0x0d0004da --rw-rw-rw- root system root system 1 1440 45784 62354 8:45:31 8:45:31 14:34:43
$
ipcs:check the shared memory allocation on a system
ipcrm:manually deallocate shared memory on a system
取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
# ipcs -m
IPC status from as of 2007年04月10日 星期二 18时32分18秒 CST
T ID KEY MODE OWNER GROUP
Shared Memory:
m 0 0x50000d43 --rw-r--r-- root root
m 501 0x1e90c97c --rw-r----- oracle dba
#ipcs |grep oracle|awk '{print $2}
501
删除ipc(清除共享内存信息)
ipcrm -m|-q|-s shm_id
%ipcrm -m 501
for i in `ipcs |grep oracle|awk '{print $2}'`
do
ipcrm -m $i
ipcrm -s $i
done
ps -ef|egrep "ora_|asm_"|grep -v grep |grep -v crs|awk '{print $2}' |xargs kill -9
取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
# ipcs -m
IPC status from as of 2007年04月10日 星期二 18时32分18秒 CST
T ID KEY MODE OWNER GROUP
Shared Memory:
m 0 0x50000d43 --rw-r--r-- root root
m 501 0x1e90c97c --rw-r----- oracle dba
#ipcs |grep oracle|awk '{print $2}
501
删除ipc(清除共享内存信息)
ipcrm -m|-q|-s shm_id
%ipcrm -m 501
for i in `ipcs |grep oracle|awk '{print $2}'`
do
ipcrm -m $i
ipcrm -s $i
done