共享内存相关(ipcs/ipcrm)

在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


请使用浏览器的分享功能分享到微信等