进程通信–mmap 文件内存映射
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
PROT_EXEC //Pages may be executed.
PROT_READ // Pages may be read.
PROT_WRITE // Pages may be written.
PROT_NONE // Pages may not be accessed.
MAP_SHARED
MAP_PRIVATE
MAP_ANON
MAP_ANONYMOUS
mmap – 创建
- 参数
- addr 传NULL
- length 映射区长度 要小于等于文件大小
- prot
- PROT_READ 可读
- PROT_WRITE 可写
- flags
- MAP_SHARED 共享的 – 对内存的修改会影响到源文件
- MAP_PRIVATE 私有的 – 如果进程 想要共享 不能选择这个
- fd 文件描述符
- offset 偏移量
- 返回值
- 成功返回 可用的内存首地址
- 失败返回 MAP_FAILED (that is, (void *) -1)
munmap – 释放
- 参数
- addr 映射的地址 (mmap的返回值)
- length mmap创建的长度
- 返回值
- 成功返回 0
- 失败返回 -1
示例
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/mman.h>
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
int main(int argc, char* argv[])
{
int fd = open("map.txt",O_RDWR);
if(fd == -1){
printf("文件打开失败\n");
return -1;
}
// 创建
char* buf = mmap(NULL,1024,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
if(buf == MAP_FAILED){
printf("映射失败\n");
return 0;
}
// 写入