mmap相关API
概述 mmap()调用进程的虚拟进程空间中一段新的内存映射。 1 2 3 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); mmap(2) — Linux manual page 用途 变更的可见性 映射类型 文件 匿名 私有 根据文件内容初始化内存 内存分配 共享 内存映射I/O,进程间共享内存(IPC) 进程间共享内存(IPC) 文件映射 创建步骤 1 2 3 4 5 6 //1. 打开使用的文件 fd = open(argv[1], O_RDONLY); //2.获取文件信息,文件大小 fstat(fd, &sb); //3. 生成内存映射 addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 相关议题 文件权限与内存保护位prot 1 2 3 fd = open(argv[1], O_RDONLY); ... addr = mmap(NULL, sb.st_size, PROT_WRITE, MAP_SHARED, fd, 0); mmap抛出 errno=13 Permission denied错误 边界情况 增加一个异常捕获的处理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void signal_handler(int no){ switch(no){ case 11: printf("get SIGSEGV\n"); break; case 7: printf("get SIGBUS\n"); break; default: printf("get %d\n", no); break; } exit(-1); } 1 2 # ls -l dax.file -rw-r--r--. 1 root root 7 Jul 18 17:51 dax.file SIGSEGV 访问超过mmap映射范围 ...