进程间通信方式之(四)共享内存

来源:互联网 发布:专业的数控编程软件 编辑:程序博客网 时间:2024/05/20 17:09
 对象:共享内存(share memory),消息队列(message quene),信号灯(semaphore)
共享内存:特点:(1)是一种最为高效的进程间的通信的方式,进程可以直接读写,而不需要任何数据的拷贝
(2)为了在进程间交换消息,内核专门留出了一块内存区,可以由需要访问的进程将其映射
到自己的私有地址空间
(3)进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而提高效率
(4)由于多个进程共享一段内存,因此需要一些共享机制,比如:互斥锁和信号量等
 实现步骤:
(1)创建或打开内存
(2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
(3)撤销共享内存映射
(4)删除共享内存映射
int shmget(key_t key,int size,int shmflg);
 函数参数:IPC_PRIVATE或ftok
size :共享内存区的大小
shmflg:同open函数的权限位,也可以用8进制表示法
返回值:成功返回内存段标识符,
出错返回-1
void *shmat(int shmid,const void *shmaddr,int shmflg);
 函数参数:shmid:要映射的共享内存区的标识符
shmaddr:将共享内存映射到指定位置(若为NULL,则表示由系统自动完成映射)
shmflg:SHM_RDONLY(共享内存只读),默认0(共享内存可读可写)
返回值:成功返回映射的地址,
出错返回-1
int shmdt(const void *shmaddr);
函数参数:shmaddr:共享内存映射后的地址

函数返回值:  0成功, -1出错

int shmclt(int shmid,int cmd,struct shmid_ds *buf)
函数参数:shmid:要操作的共享内存标识符
 cmd:IPC_STAT(获取对象属性)
     IPC_SET(设置对象属性)
 IPC_RMID(删除对象)
 buf:指定IPC_STAT/IPC_SET时用以保存/设置属性
函数返回值   0成功,-1出错
0 0