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);
|
匿名映射
匿名映射没有对应的文件。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); }
|