共享存储函数

共享存储

共享存储允许两个或多个进程共享一个给定的存储区。数据不需要在客户进程
和服务器进程之间复制,因此这是最快的一种进程间通信的方式。使用的窍门是
多个进程访问存储区时,需要采取一定的同步控制。


获取一个共享存储标志:shmget函数
#include<sys/shm.h>
int shmget(key_t key, size_t szie, inf flag);
成功--共享存储ID,出错-- -1


参数:
key  -- IPC对象对应的键
size -- 共享存储段的长度,以字节位单位,通常为系统页长的整数倍。
flag -- 共享存储段的权限


对共享存储段的控制:shmctl函数
#include<sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
成功--0,出错-- -1


参数:
cmd --  1)IPC——STAT 将此段的shmid_ds结构存储到buf数组里面。
2)IPC_SET  将buf结构里面的值设置到本段相关的shmid_ds结构中的
  shm_perm.uid,shm_perm.gid 和 shm_perm.mode.此操作只能是有效
  用户ID等于shm_perm.cuid 或 shm_perm.uid 或超级用户。
3)IPC_RMID  从系统中删除该共享存储段。除非该段的最后一个进程结束
  或与该段分离,否则不会真正删除这个段。不管此段是否还在使用,该
  此操作只能是有效用户ID等于shm_perm.cuid 或 shm_perm.uid 或超级用户。


  
连接到共享存储段的地址空间去:shmat函数
#include<sys/shm.h>
void  *shmat(int shmid,const void *addr,int flag);
成功--指向共享存储段的指针,出错-- -1
调用成功后,shmid_ds结构的shm_nattch计数器加1


参数:
addr -- 0,由内核选择第一个可用的地址
flag -- SHM_RDONLY,以只读的方式连接此段
否则,以读写的方式连接此段
  
  
进程分离共享存储段:shmdt函数
#include<sys/shm.h>
int shmdt(const void *addr);
成功--0,出错-- -1 
调用成功后,shmid_ds结构的shm_nattch计数器减1



匿名存储映射

使用mmap函数实现,调用mmap函数时指定MAP_ANON,文件描述符指定为 -1.

area = mmap(0,SIZE,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章