共享存储(UNIX环境高级编程笔记)

  共享存储允许两个或者多个进程共享一个给定的存储区。因为数据不需要在客户进程和服务器进程之间进行复制,所以这是最快的一种IPC。通常,使用信号量同步共享存储访问。
  调用的第一个函数通常是shmget,它获得一个共享存储标识。

#include <sys/shm.h>
int shmget(key_t key, size_t size, int flag);
                返回值:若成功,返回共享存储ID;若出错,返回-1

  参数size是该共享存储段的长度,以字节为单位。如果正在创建一个新段,则必须指定其size。如果正在引用一个现存的段,则将size指定为0。当创建一个新段时,段内的内容初始化为0。
  shmctl函数对共享存储段执行多种操作。

#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
                   返回值:若成功,返回0;若出错,返回-1

  cmd参数指定下列5中命令的一种,使其在shmid指定的段上执行。

宏定义作用
IPC_STAT获取此段的shmid_ds结构,并将它存储在由buf指向的结构中。
IPC_SET按buf指向的结构中的值设置与此共享存储段相关的shmid_ds结构中的shm_perm.uid、shm_perm.gid和shm_perm.mode成员。
IPC_RMID从系统中删除该共享内存段
SHM_LOCK在内存中对共享内存中加锁。此命令只能由超级用户执行。
SHM_UNLOCK解锁共享内存段。此命令只能由超级用户执行。

  一旦创建了一个共享内存段,进程就可以调用shmat将其连接到它的地址空间中。

#include <sys/shm.h>
void shmat*(int shmid, const void *addr, int flag);
           返回值:若成功,返回指向共享存储段的指针;若出错,返回-1

  分离共享存储可使用shmdt函数。

#include <sys/shm.h>
int shmdt(const void *addr);
                     返回值:若成功,返回0;若出错,返回-1

  shmdt并不从系统中删除其标识符以及其相关的数据结构。该标识符依然存在,直至某个进程调用shmctl函数删除它位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值