《应用编程 — 进程通信 — 共享内存》

1.共享内存

  共享内存:共享内存是一种最为高效的进程间通信方式。因为数据可以直接读写内存,不需要任何数据的拷贝。内核专门留出一块内存区,这段内存区可以由需要访问的进程将其中映射到自己的私有地址空间。但同时由于多个进程共享一段内存,因此也需要依靠同步机制,如互斥锁和信号量。

2.shmget

#include <sys/shm.h>

int shmget(key_t key, int size, int shmflg)
第一个参数key:有效地为共享内存段命名
第二个参数size:以字节为单位制定需要共享的内存容量
第三个参数shmflg:权限标志
返回值: 成功:非负整数即共享内存标识符; 失败:-1

  作用:创建共享内存

3.shmat

#include <sys/shm.h>

char *shmat(int shmid, const void*shmaddr,int shmflg)
第一个参数shmid:共享内存标识符
第二个参数shmaddr:将共享内存映射到指定位置(若为0则表示让系统来选择共享内存出现的地址)
第三个地址:SHM_RND(这个标志与shm_addr联合使用,用来控制共享内存连接的地址)
      SHM_RDONLY(使它连接的内存只读)
      默认0:共享内存可读可写
返回值:返回一个指向共享内存第一个字节的指针; 失败:-1

  作用:第一次创建共享内存时,它不能被任何进程访问。要想启用该共享内存的访问,必须将其连接到一个进程的地址空间中。

4.shmdt

#include <sys/shm.h>

int shmdt(const void *shmaddr)
第一个参数shmaddr:
shmaddr:被映射的共享内存段地址
返回值: 成功:0; 失败:-1

  作用:将共享内存从当前进程中分离(并不是删除)。 

5.shmctl

#include <sys/shm.h>

int shmctl(int shm_id, int command, struct shmid_ds *buf);
第一个参数shm_id:shmget返回的共享内存标识符
第二个参数command:要采取的动作,可以取三个值
    IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
    IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
    IPC_RMID:删除共享内存段
第三个参数buf:是一个指针,它指向包含共享内存模式和访问权限的结构
返回值:成功:0;失败:-1
struct shmid_ds{
  uid_t shm_perm.uid,
  uid_t shm_perm.gid;
  mode_t shm_perm.mode;
};

 

猜你喜欢

转载自www.cnblogs.com/zhuangquan/p/12299670.html
今日推荐