mmap能将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。普通文件在被映射到进程地址空间后,进程可以像访问普通内存一样访问文件,不必通过read()、write()等系统调用来访问文件。

mmap接口描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <sys/mman.h>

void *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
// addr: 内存空间上的起始地址,一般为NULL,内核自动分配
// length: 字节数
// prot: 共享内存的访问权限
/*
PROT_READ
PROT_WRITE
PROT_EXEC
PROT_NONE
*/
// flags:
// fd: 文件描述符
// offset: 偏移量

// 返回值: 文件映射到进程空间的地址。

匿名映射

匿名映射没有对应的文件。fork()得到的子进程会拷贝父进程映射后的空间,同时也继承了mmap()的返回地址,从而实现进程间的通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 匿名映射的例子
ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
pid = fork();
switch(pid) {
case pid < 0:
printf("err\n");
break;
case pid = 0:
lock(ptr);
critical_section();
unlock(ptr);
case pid > 0:
lock(ptr);
critical_section();
unlock(ptr);
}