共享内存
最为高效的进程间通信方式
进程直接读写内存,不需要任何数据的拷贝
.为了在多个进程间交换信息,内核专门留出了一块内存区
.由需要访问的进程将其映射到自己私有地址空间
.进程直接读写这一内存区而不需要进行数据的拷贝,提高了效率
多个进程共享一段内存,需要依靠某种同步机制,如互斥锁和信号量等
共享内存编程步骤:
创建共享内存
.函数shmget()
.从内存中获得一段共享内存区域
所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>
函数原型
Int shmget(key_t key,int size,int shmflg)
函数传入值
key:共享内存的键值,多个进程可以通过它访问同一个共享内存,其中有个特殊值IPC_PRIVATE.它用于创建当前进程的私有共享内存
size:共享内存大小
shmflg:同open函数的权限位,也可以用八进制表示法
函数返回值
成功返回共享内存段标识符,出错-1
映射共享内存
.把这段创建的共享内存映射到具体的进程空间中
.函数shmat()
所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>
函数原型
char * shmget(int shmid,const void *shmaddr,int shmflg)
函数传入值
shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(若为0则表示系统自动分配地址,并把改段共享内存映射到调用进程的地址空间)
shmflg:SHM_RDONLY:共享内存只读
默认0:共享内存可读写
函数返回值
成功返回被映射的段地址,出错-1
使用这段共享内存
.可以使用不带缓冲的I/O读写命令对其进行操作
撤销映射操作
.函数shmdt()
所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>
函数原型
Int shmdt(const void* shmaddr)
函数传入值
shmaddr:被映射的共享内存段地址
函数返回值
成功0,出错-1
删除共享内存
.函数shmctl()
所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>
函数原型
Int shmctl(int shmid,int cmd,struct shmid_ds *buf
函数传入值
shmid:共享内存标识符
cmd:IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
IPC_RMID:删除这片共享内存
函数返回值
成功返回0,出错返回-1