进程间通讯-共享存储

来源:互联网 发布:五星缩水软件免费版 编辑:程序博客网 时间:2024/06/05 02:22

一、什么是共享存储

    共享存储允许两个或更多进程共享一给定的存储区。因为数据不需要在进程A和进程B之间复制,所以共享存储是最快的一种IPC。那么使用共享存储需要注意的问题是什么呢?因为是多个进程访问一个共同的存储区,所以需要注意的问题就是多个进程如何实现对同一存储区实现同步访问。若进程A正在将数据放入共享存储区,则在它做完这一操作之前,进程B不应该去读取这些数据。通常,信号量用于实现对共享存储访问的同步,所以,在使用共享存储解决问题时,需要在其中联合信号量操作。

    共享存储的原理:

       

          进程A和进程B同时拥有同一块存储区域,这块区域既可以属于进程A,也可以属于进程B。

    共享存储也有内核对象来管理共享的内存区域

       

二、Linux中共享存储相关操作

1、创建或者获取函数

   int shnget((key_t)key,size_t size,int flag); 返回值:若成功则返回共享存储ID,失败则返回-1

      size:将要开辟的内存空间的大小

      flag:IPC_CREAT-如果存在共享存储,则直接获取共享存储ID

                                   -如果不存在,则创建新的共享存储

 2、链接

   void *shmat(int shmid,void *addr,int flag); 返回值:若成功则返回指向共享存储的指针,若失败则返回-1

      如果addr为0,则由内核选择

      如果addr不为0,并且flag没有指定为SHM_RND,则此段连接到addr所指定的地址上

      如果addr非0,并且指定flag为SHN_RND,则此段连接到向addr低边界地址倍数取整的地址上。    

 3、断开链接

   int shmdt(void *ptr); 返回值:若成功则返回0,失败则返回-1

      此函数只完成断开链接操作,并不会删除共享内存。如果想删除共享内存,那么在shmctl函数中,参数cmd取IPC_RMID

 4、删除内核对象

   int shmctl(int shmid,int cmd,struct shmid_ds *buff); 返回值:若成功则返回0,若失败则返回-1

注意:共享内存是两个以上的进程能够操作同一块物理空间的内存区域,所以共享的区域就成了临界资源,所以对于共享区域的访问就必须要使用信号量做同步控制。