Posix 共享内存区
Posix.1 提供了两种无亲缘关系进程间共享内存区的方法:(都需要调用 mmap)
- 内存映射文件 (memory-mapped file):由 open 函数打开,由 mmap 函数把得到的描述符映射到当前进程地址空间中的一个文件。
- 共享内存区对象 (share-memory object):由 shm_open 打开一个 Posix.1 IPC 名字,所返回的描述符由 mmap 函数映射到当前进程的地址空间。
1. 相关函数
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
// 只是打开一个内存区对象,返回 fd
// oflag: 必须函数 O_RDONLY、O_RDWR 中的一个。
// mode:
// * 指定权限为,在指定了 O_CREAT 的前提下使用。
// * 与 mq_open 和 sem_open 不同,shm_open 的 mode 参数必须指定。
int shm_open(const char *name, int oflag, ...);
// 删除一个共享内存区对象的名字。(删除一个名字不会影响低层支撑对象的现有引用。)
int shm_unlink(const char *name);
// 裁剪普通文件或者共享内存区对象
int ftruncate(int fd, off_t length);
//获取打开的共享内存对象的信息
int fstat(int fildes, struct stat *buf);
2. 示例
A.注意
- 在 macOS 10.14.5 中,shm_open 并不会创建对应的同名文件。
- 详见示例 1
B.问题
- 为什么 shm_open 不直接返回共享内存的地址?
- 因为 Posix.1 的共享内存发明之前,mmap 已经存在。
- mmap 使用的是已打开的描述符。
- 是否支持亲缘进程间使用?先映射,再 fork,是否还能使用?
- 支持。父进程中 open/shm_open;fork 后,分别 mmap。
- 详见示例 5_ex
- 是否支持无亲缘进程间使用?
- 支持。