一、背景
在Linux应用开发中经常会采用多进程+多线程的模式来进行开发,那么进程之间的通信就非常重要,接下来要介绍的就是进程间通信方式之一的共享内存。共享内存相比较其他的IPC方式最明显的优点就是速度快。各个进程间共享一块的内存空间,数据交互只需要一次拷贝即可,效率非常高。但是由于Linux提供的的共享内存机制没有提供同步互斥的机制,所以在使用的共享内存的时候需要用户自己来实现消息的同步互斥机制,保证共享内存间的数据不会错乱。最常用的就是“信号量+共享内存” 的机制用来保证通讯数据的正确定。
二、基本实现原理
共享内存顾名思义就是所有需要通信的进程都公用一段公共内存空间。但是我们都知道Linux系统为保证内存安全,为每一个进程都分配的一段虚拟地址来使用,每个进程映射出来的虚拟地址都不一样,应用程序是无法直接操作物理内存的,既然无法访问那应该怎么让不同进程共享一段内存空间呢?答案是通过key值映射的方式,来保证每个进程都能映射到同一段物理空间,虽然虚拟地址空间是不固定的,但是这段虚拟地址空间映射到的物理内存是固定的。这样每个进程只要通过同一个key值去申请共享内存,然后将这段物理内存映射到进程的虚拟地址空间,就能实现不同进程访问同一段物理内存空间了。基本原理如下图所示:
三、API接口解析
- key_t ftok(const char *pathname, int proj_id); 该接口是生成key值的接口,pathname是一个已经存在的路径,p