1、概述
Posix.1提供了两种在无亲缘关系进程间共享内存区的方法。
- 内存映射文件(memory-mapped file):由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件。内存映射文件也可以在无亲缘关系的进程间共享。
- 共享内存区对象(shared-memory object):由shmopen打开一个Posix.1 IPC名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间。
这两种技术都需要调用mmap,差别在于作为mmap的参数之一的描述符的获取手段:通过open或通过shm_open。图13-1展示了这个差别。Posix把两者合称为内存区对象(memory object)。
2、shm_open 和 shm_unlink 函数
Posix共享内存区涉及以下两个步骤要求。
- 指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象。
- 调用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的返回值是一个整数描述符,它随后用作