共享内存

共享内存
最为高效的进程间通信方式
进程直接读写内存,不需要任何数据的拷贝
  .为了在多个进程间交换信息,内核专门留出了一块内存区
  .由需要访问的进程将其映射到自己私有地址空间
  .进程直接读写这一内存区而不需要进行数据的拷贝,提高了效率
多个进程共享一段内存,需要依靠某种同步机制,如互斥锁和信号量等






共享内存编程步骤:
创建共享内存
  .函数shmget()
  .从内存中获得一段共享内存区域

所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>

   函数原型
Int shmget(key_t key,int size,int shmflg)

   

函数传入值
key:共享内存的键值,多个进程可以通过它访问同一个共享内存,其中有个特殊值IPC_PRIVATE.它用于创建当前进程的私有共享内存
size:共享内存大小
shmflg:同open函数的权限位,也可以用八进制表示法

   函数返回值
成功返回共享内存段标识符,出错-1

映射共享内存
 .把这段创建的共享内存映射到具体的进程空间中
 .函数shmat()

所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>

   函数原型
char * shmget(int shmid,const void *shmaddr,int shmflg)

   

函数传入值
shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(若为0则表示系统自动分配地址,并把改段共享内存映射到调用进程的地址空间)
shmflg:SHM_RDONLY:共享内存只读
默认0:共享内存可读写

   函数返回值
成功返回被映射的段地址,出错-1

使用这段共享内存
 .可以使用不带缓冲的I/O读写命令对其进行操作
撤销映射操作
  .函数shmdt()

所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>

   函数原型
Int shmdt(const void* shmaddr)

   函数传入值
shmaddr:被映射的共享内存段地址

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

删除共享内存
 .函数shmctl()

所需头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <shm.h>

   函数原型
Int shmctl(int shmid,int cmd,struct shmid_ds *buf

  

  函数传入值
shmid:共享内存标识符
cmd:IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
IPC_RMID:删除这片共享内存

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值