1.共享内存的概念
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。通信的前提是让两个进程看到同一份资源,信息的交流是建立在这个同一份资源上的,共享内存这种通信方式提供的资源或者平台是物理内存中的一块空间。首先在物理内存中申请一块空间,然后通过页表将这块空间映射到两个需要通信进程的进程地址空间,这样两个进程就可以对这块空间进行数据的写入和读取。
2.共享内存的创建
1.首先在物理地址中开辟好共享内存空间,供进程间通信使用。而且我们知道物理地址中的共享内存可能会有很多个,那么linux就要管理这些内存,管理的方法是先描述再组织,所以除了创建共享内存之外,还要为共享内存创建共享内存的内核数据结构。
2.将共享内存挂接到地址空间,本质上就是给两个进程之间的共享内存和虚拟地址空间之间建立映射,之后就可以开始进程间的数据传输与修改了。
3.用完之后要去掉共享内存和进程地址空间之间的联系,本质上就是修改页表,取消共享内存和虚拟内存的映射关系。
4.释放共享内存,将内存归还给系统。
3.函数接口
创建共享内存函数shmget()
key_t key是用来标识共享内存的,可以保证共享内存本身的唯一性
size_t size 表明需要申请空间的大小,单位是字节
int shmflg 是标志位,有两个参数IPC_CREAT 和IPC_EXCL这里的IPC_CREAT表示如果当前路径下不存在共享内存就创建一个新的共享内存,如果存在共享内存就直接使用该共享内存。后面的IPC_EXCL一般都和IPC_CREAT一起使用,两个标志位一起使用的时候就表示如果该路径下不存在共享内存就创建新的共享内存,如果存在共享内存就会报错,这样就可以保证我们永远使用的都是新创建的共享内存,这样就可以避免使用其他进程创建的共享内存而导致错误。
生成key的函数接口:
pathname路径名
proj_id 项目