一、共享内存
1、简单介绍
(1)共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不再涉及内核,即进程不再通过执行进入内核的系统调用来传递彼此的数据。
(2)共享内存的生命周期随内核。
(3)注意:共享内存未提供任何保护资源,即共享内存自身没有同步与互斥机制,但它是临界资源,所以我们需要利用其它机制来保证数据的正确性,Linux下就可以用信号量达到同步的目的。
(4)linux共享内存有两种方式(本文主要介绍shmget方式):
1)mmap方式,适用于父子进程之间,创建的内存非常大时;
2)shmget方式,适用于同一台电脑上不同进程之间,创建的内存相对较小。
(5)进程间利用共享内存实现消息队列的基本原理如下图
2、相关函数介绍
(1)shmget函数
1)函数原型:
2)函数功能:创建共享内存
3)参数:
key:共享内存段名字
size:共享内存大小
shmflg:九个权限标志构成,用法与创建文件时用的mode一致
4)返回值:成功返回一个非负整数,即该共享内存段标识码;失败返回-1
(2)shmat函数
1)函数原型:
2)函数功能:将共享内存段连接到进程地址空间
3)参数:
shmid:共享内存标识码
shmaddr:指定连接的地址
shmflg:两个可能取值SHM_RND和SHM_RDONLY
4)返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
5)说明:
shmaddr为NULL时,核心自动选择一个地址;
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址;
shmaddr不为NULL时,且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍,相应公式为:shmadrr - (shmadrr % SHMLBA);
shmflg = SHM_RDONLY,表示连接操作用来只读共享内存
(3)shmdt函数
1)函数原型:
2)函数功能:将共享内存段与当前进程脱离
3)参数:
shmadrr:由shmat函数返回的指针
4)返回值:成功返回0;失败返回-1
5)注意:将共享内存段与当前进程脱离不等于删除共享内存段
(4)shmctl函数
1)函数原型:
2)函数功能:用于控制共享内存
3)参数:
shmid:由shmget函数返回的共享内存标识码
cmd:将要采取的动作,有三个可取值
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
4)返回值:成功返回0;失败返回-1