13.Poxis 共享内存区

1、概述

Posix.1提供了两种在无亲缘关系进程间共享内存区的方法。

  1. 内存映射文件(memory-mapped file):由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件。内存映射文件也可以在无亲缘关系的进程间共享。
  2. 共享内存区对象(shared-memory object):由shmopen打开一个Posix.1 IPC名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间。

这两种技术都需要调用mmap,差别在于作为mmap的参数之一的描述符的获取手段:通过open或通过shm_open。图13-1展示了这个差别。Posix把两者合称为内存区对象(memory object)。

 

2、shm_open 和 shm_unlink 函数

Posix共享内存区涉及以下两个步骤要求。

  1. 指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象。
  2. 调用mmap把这个共享内存区映射到调用进程的地址空间。

传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。

#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);
    	// 返回:若成功则为非负描述符,若出错则为-1
int shm_unlink(const char *name);
            // 返回:若成功则为0,若出错则为-1

oflag参数必须或者含有O_RDONLY (只读)标志,或者含有O_RDWR (读写)标志,还可以指定如下标志: O_CREAT、 O_EXCL或O_TRUNC。 如果随O-RDWR指定0-TRUNC标志,而且所需的共享内存区对象已经存在,那么它将被截短成0长度。mode参数指定权限位,它在指定了0-O_CREAT标志的前提下使用。注意,与mq_open和sem_open函数不同,shm_open的mode参数总是必须指定。如果没有指定O_CREAT标志,那么该参数可以指定为0。

shm_open的返回值是一个整数描述符,它随后用作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值