mmap
#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
(读作 my map)
使用 mmap 可以将磁盘上的文件映射到用户的虚拟地址空间中
其首地址可以通过函数 mmap 的返回值获取
addr 一般设置成 0,表示由系统选取映射区的首地址
length 一般设置成文件的长度,代表将整个文件映射到虚拟空间中
prot 有如下值
● PROT_EXEC 映射区可执行 ● PROT_READ 映射区可读 ● PROT_WRITE 映射区可写 ● PROT_NOE 映射区不可访问
flags 一般设置成如下值
● MAP_SHARED 对映射区修改的同时,也修该磁盘文件 ● MAP_PRIVATE 在映射区创建一个磁盘文件的副本,对映射区修改并不影响磁盘文件
fd 是磁盘文件的文件描述符
offset 一般设置成 0
返回值:成功返回映射区地址,失败返回 MAP_FAILED
使用时的注意事项
1 不能通过 mmap 增加文件长度 2 使用前应先打开文件。要不然 fd 填啥 :)
munmap
int munmap(void *addr, size_t length);
(读作 my unmap)
用于解除映射区
成功返回 0,失败返回 -1
简单实例
将当前目录下的 m.txt 映射到虚拟空间中,并将其输出到屏幕
#include <stdio.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> int main() { int fd; int rv; int nwrite; struct stat sbuf; char *mbuf; fd = open("m.txt", O_RDONLY); if(fd < 0) { perror("ope error"); return -1; } rv = stat("m.txt", &sbuf); if(rv != 0) { perror("stat error"); return -1; } mbuf = (char *)mmap(0, sbuf.st_size, PROT_READ, MAP_PRIVATE,fd, 0); if(mbuf == MAP_FAILED) { perror("mmap error"); return -1; } nwrite = write(STDOUT_FILENO, mbuf, sbuf.st_size); munmap(mbuf, sbuf.st_size); close(fd); return 0; }