您的位置:首页 > 运维架构 > Linux

linux-进程间通信-共享内存

2018-03-30 19:57 267 查看
一、共享内存的概念

  共享内存就是在内存上找一块空间,多个进程可以同时使用这块空间来传输数据,这块空间是这几个进程所共享的。

  正因为这块空间共享,属于这几个进程中的每一个进程,所以这块内存属于临界资源,使用的时候需要用信号量进行同步控制。

  共享内存是最快的一种IPC(进程间通讯方式)。

 共享内存在各个进程中都有直接的指针指向开辟内存区域,在访问时当做本进程中的一块内存,直接访问。

二共享内存的实现

进程A、B通过访问内核对象,找到共享区域的首地址。

这块共享区域是共享的,既属于A,也属于B。所以这块内存既在A
中也在B中。





二共享内存的操作

(1)创建或者获取

  int shmget(key_t key, size_t size, int shmflg); 

  成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。

 调用失败返回-1。key 是键值,它有效地为共享内存段命名;size 开辟内存空间的大小;

   shmflg是权限标志  shmflg: IPC_CREAT如果存在则获取,如果不存在,则创建。

(2)链接

  第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。        
    void *shmat(int shm_id, const void *shm_addr, int shmflg);

 返回一个指向内存首地址的指针,shm_id是内存标识符;shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址;shm_flg是一组标志位,通常为0。

(3)断开链接

  该函数用于将共享内存从当前进程中分离。不会将共享内存删除,只是使该共享内存对当前进程不再可用。

 int shmdt(void *ptr);

  ptr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1. 

(4)删除内核对象

 int shmctl(int shm_id, int command, struct shmid_ds *buf); 

   command是要采取的操作,它可以取下面的三个值:

  IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。

  IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值

   IPC_RMID:删除共享内存段

 buf是一个结构指针,它指向共享内存模式和访问权限的结构。这个结构如下

  shmid_ds结构至少包括以下成员

 struct
4000
 shmid_ds

    {  uid_t shm_perm.uid; 

        uid_t shm_perm.gid; 

        mode_t shm_perm.mode; 

   }; 

 四共享内存的实现

 

  

 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: