1、mmap - 创建内存映射区
- 作用:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件
- 函数原型:
void *mmap(
void *adrr, //映射区首地址,传NULL
size_t length, //映射区的大小,不能为0,文件多大,length多大
int port, //映射区权限,PORT_EXEC、
PORT_READ -- 映射区必须要有读权限
PORT_WRITE、
PORT_NONE
int flags, //标志位参数,MAP_SHARED -- 修改了内存数据会同步到磁盘
MAP_PRIVATE --修改了内存数据不会同步到磁盘
int fd, //文件描述符,被映射的文件对应的文件描述符,通过open()得到
off_t offset, //映射文件的偏移量。映射的时候文件指针的偏移量,必须是4k的整数倍
);
- 返回值:映射区的首地址--调用成功;返回(void *)-1 -- 调用失败
2、munmap - 释放内存映射区
- 函数原型
int munmap(
void *addr, //mmap的返回值,映射区的首地址
size_t length //映射区的首地址
);
3、示例
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
# include <sys/stat.h>
# include <sys/types.h>
# include <sys/mman.h>
int main()
{
int fd = open("/home/FUJIA/cy1706/practice/english.sh",O_RDONLY | O_WRONLY);
if(fd == -1)
{
printf("open error");
exit(0);
}
int len = lseek(fd,0,SEEK_END);
printf("%d\n",len);
void *ptr = mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
if(ptr == MAP_FAILED);
{
perror("mmap error");
exit(1);
}
//printf("%s",(char *)ptr);
munmap(ptr,len);
close(fd);
return 0;
}