参考
https://blog.csdn.net/bhniunan/article/details/104105153
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
参数
-
addr:出参, 指定映射的起始地址,通常设为NULL,由内核来分配
-
len:入参, 代表将文件中映射到内存的部分的长度。
-
prot:入参,映射区域的保护方式。可以为以下几种方式的组合:
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取 -
flags:入参,映射区的特性标志位,常用的两个选项是:
MAP_SHARD:写入映射区的数据会复制回文件,且运行其他映射文件的进程共享
MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写会原文件 -
fd:入参,要映射到内存中的文件描述符,有open函数打开文件时返回的值。
-
offset:入参,文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。
返回值
实际分配的内存的起始地址。
int munmap(void *start, size_t length)
与mmap函数成对使用的是munmap函数,它是用来解除映射的函数
参数
- start:映射的起始地址
- length:文件中映射到内存的部分的长度
返回值
解除成功返回0,失败返回-1。
//打开文件
fd = open("testdata",O_RDWR);
//创建mmap
start = (char *)mmap(NULL,128,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
//读取文件
strcpy(buf,start);
printf("%s\n",buf);
//写入文件
strcpy(start,"Write to file!\n");
munmap(start,128);
close(fd);
这段代码实现了将测试文件testdata打开,并用mmap函数将文件映射到虚拟内存中,通过指针start对文件进行读写。在终端中可看到由文件读取的数据。程序结束后,可以查看testdata文件,来查看写入的数据。