1.mmap函数-创建内存映射
作用:
将磁盘文件的数据映射到内存,用户通过内存就能修改磁盘文件
返回值:
映射区的首地址-调用成功
调用失败:MAP_FALED
函数原型:
void *mmap{void *addr; size_t length;int prot;int flags;int fd;off_t offset; }
addr 映射区首地址,传NULL
length 映射区的大小;会自动调为4k的整数倍;不能为0;一般文件多大,length就指定多大
prot 映射区权限;PROT_READ 映射区比必须要有读权限;PROT_WRITE;PROT_READ | PROT_WRITE
flags 标志位参数;MAP_SHARED 修改了内存数据会同步到磁盘;MAP_PRIVATE 修改了内存数据不会同步到磁盘
fd 要映射的文件对应的fd
offset 映射文件的偏移量,从文件的哪里开始操作;映射的时候文件指针的偏移量;必须是4k的整数倍;一般设置为0
运行示例mmap.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
int main(void)
{
int len,ret;
char *p=NULL;
int fd=open("mytest.txt",O_CREAT|O_RDWR,0604);
if(fd<0)
{
perror("open error:");
exit(1);
}
len=ftruncate(fd,4);//改变文件大小
if(len==-1)
{
perror("ftruncate error:");
exit(1);
}
p=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(p==MAP_FAILED)
{
perror("mmap error:");
exit(1);
}
strcpy(p,"abc\n");//写数据
ret=munmap(p,4);
if(ret==-1)
{
perror("munmap error:");
exit(1);
}
close(fd);
return 0;
}
make mmap
./mmap
将会创建mytest.txt。
cat mytest.txt
2.munmap-释放内存映射区
函数原型:int munmap(void *addr,size_t length);
addr-mmap的返回值
length-mmap的第二个参数