1. 基本信息
共享内存区是可用IPC中最快的,一旦其映射到共享它的进程的地址空间,进程间的数据场地就不再涉及内核(无需系统调用传递数据)。
普通的客户-服务程序涉及的步骤:
服务端读文件—》服务端写入IPC—》客户端读IPC—》客户端写入文件
而使用共享内存:
服务端将文件读入共享内存对象—》客户端从共享对象写入文件。
2. mmap、munmap和msync函数
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot,int flags, int fd, off_t offset); //成功返回映射区起始地址,失败返回MAP_FAILED
addr 指定起始地址,一般置为NULL,内核自己选择起始地址;
len 指定映射到调用进程空间的字节数,其从距离文件头offset个字节数开始,一般设为0.
prot 内存映射区的保护由此参数指定,该参数的常见值是代表读写访问的PROT_READ| PROT_WRITE
PROT_READ 数据可读
PROT_WRITE 数据可写
PROT_EXEC 数据可执行
PROT_NONE 数据不可访问
flags 常值指定,MAP_SHARED 或 MAP_PRIVATE这两个必须指定一个
MAP_SHARED 变动是共享的
MAP_PRIVATE 变动是私有的
MAP_FIXED 准确的解释addr参数,可移植程序不应指定
该函数把一个文件或posix共享内存区对象映射到调用进程的地址空间。主要有三个目的:
A. 使用普通文件以提供内存映射I/O
B. 是用特殊文件以提供匿名内存映射
C. 是用shm_open以提供无亲缘关系进程间的Posix共享内存区。
父子进程之间共享内存区的方式是在fork之前指定MAP_SHARED调用mmap。一旦mmap成功返回