进程通信IPC之共享内存
共享内存是进程间大量数据通信效率最高的一种方式,进程通过调用系统函数,获得一块共享内存,与自己的进程内地址绑定,这样访问跟访问进程自己的地址空间一样,所以也是很方便的一种通信方式。
与共享内存操作相关的系统调用声明及一些宏定义包含在下面头文件里:
- 创建获得一块共享内存:
key 标识共享内存的键值,如果进程想获得已存在的共享内存的操作句柄,填写的键值必须和创建这个存在共享内存是的键值一致。
key 可以通过这个函数获得:(当然也可以自己填写)
size共享内存的大小。
shmflg 一组标志:(多属性用 或 运算)
常用标志:
IPC_CREAT 创建或获得一块已存在的内存。
IPC_EXCL 与IPC_CREAT一起使用,创建一块新的内存块,若内存块存在,则shmget会调用失败(返回-1)
模式标志(Mode_flags):9 位组成…………
函数调用成功,返回操作共享内存句柄, 失败返回-1。
- 绑定共享内存到用户进程地址空间里 与脱离
shmid shmget()函数返回的。
shmaddr指定共享内存绑定到那块地址空间。不过一般我们都不自己指定地址,而是把这里填 NULL ,由系统在进程地址空间分配地址返回给我们。
shmflg 标志位 SHM_RND 在指定地址(第二个参数),被向下靠拢到内存页面的整数倍。
SHM_RDONLY共享内存只读
函数调用成功返回绑定共享内存对应的地址,失败返回 (void *)-1。
取消上面函数返回地址与共享内存的绑定。
成功返回 0 , 失败返回 -1。
- 释放共享内存 (管理共享内存)
当cmd 为 IPC_RMID, buf = NULL(任意) ; 删除共享内存。
这个函数是管理共享内存的,通过cmd参数决定是什么操作,buf是共享内存的相关属性,可以设置(IPC_SET),可以获取(IPC_STAT)。
成功返回0,失败返回-1。
例:
以上代码只是简单演示操作共享内存,没有检查返回值的合法性。而且程序还要按照严格执行顺序才可以(下节学习使用信号量控制对共享内存的访问...)。