Bootstrap

Linux进程间通信-共享内存 &信号量

一、共享内存

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

;