目录
mmap
概念
使用
函数声明
mmap
概念
mmap 将 一个文件或者其它对象 映射到 进程的地址空间
实现 磁盘地址 和进程 虚拟的虚拟地址 的一一对应关系。
通过mmap 系统调用,我们可以 实现共享内存或者普通文件被映射到进程地址空间当中,进程可以向访问普通内存一样对文件进行操作。
使用
函数声明
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数
addr 映射区的起始地址,如果是NULL系统自动分配
length 字节长度自动按照4kb对齐所以建议大小一般填成4kb的整数倍
port 映射区域的权限
flags 映射的标志位
fd 文件描述符
offset 文件偏移量自动按照4k对齐
port
PORT_EXEC:映射的区域具有可执行权限
PROT_READ:映射的区域具有可读权限
PROT_WRITE:映射区域具有可写权限
PROT_NONE:映射区域不可被访问
flags
MAP_SHARED:对映射区域的写入操作直接反映到文件当中
MAP_FIXED:若在start上无法创建映射则失败(如果没有此标记会自动创建)
MAP_PRIVATE:对映射区域的写入操作只反映到缓冲区当中不会写入到真正的文件
MAP_ANONYMOUS:匿名映射将虚拟地址映射到物理内存而不是文件(忽略fd)
MAP_DENYWRITE:拒绝其它文件的写入操作
MAP_LOCKED:锁定映射区域保证其不被置换
返回值
函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。
#include <iostream>
#include <sys/mman.h>
#include <cstring>
#include <cerrno>
#include <cstdio>
using namespace std;
static const int SIZE = 4096;
int main()
{
char *str = (char *)mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
//注意MAP_PRIVATE和MAP_SHARED
//建立映射
if (str == MAP_FAILED)
{
printf("%s\n", strerror(errno));
return -2;
}
strcpy(str, "hello ksy");
puts(str);
//用于取消映射
munmap(str, SIZE);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)