#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
功能:将一个文件或者设备的数据映射到内存中
参数:
-addr:内存中映射的首地址,一般设置为NULL,表示由内核指定
-length:要映射的数据的长度,这个值不能为0,建议使用文件的长度
获取文件的长度可以使用stat函数或者lseek函数
-prot:对申请的内存映射区的操作权限
- PROT_EXEC:可执行的权限
- PROT_READ:读权限 要操作映射内存,必须要有读的权限
- PROT_WRITE:写权限
- PROT_NONE:没有权限
-flags:
- MAP-SHARED:映射区的数据会自动和磁盘文件进行同步,进程间通信,必须设置这个选项
- MAP-PRIVATE:不同步,内存映射区的数据改变了,对原来的映射区不会修改,会重新创建一个映射区
个新的映射区。(copy on write)
-fd:需要映射的那个文件的文件描述符,通过open得到,open的是一个磁盘文件
注意:文件的大小不能为0,open指定的权限不能和prot参数有冲突
prot:PROT_READ open:只读/读写
prot:PROT_READ | PROT_WRITE open:读写
prot的权限要小于等于open中的权限,并且prot必须有读的权限
-offset:偏移量,一般不用。必须指定的是4K的整数倍。0表示不便宜
返回值:返回创建的内存的首地址
失败返回MAP_FAILED,(void*)-1
int munmap(void *addr, size_t length);
功能:释放内存映射
参数:
-addr:要释放的内存的首地址
-length:要释放的内存的大小,要和mmap的length值一样。
返回值:
成功返回0,失败返回-1
使用内存映射实现进程间通信:
1.有关系的进程(父子进程)
还没有子进程的时候,通过唯一的父进程,先创建内存映射区
有了内存映射区以后,创建子进程
父子进程共享创建的内存映射区
2.没有关系的进程间通信
准备一个大小不是0的磁盘文件
进程1通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
进程2通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
使用内存映射区通信
注意:内存映射区通信,是非阻塞的