1 mmap案例
直接看代码即可,注释已经写清楚了。
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
void sys_err(char *str)
{
perror(str);
exit(1);
}
int main(void)
{
char *mem = NULL;
int len = 0;
int fd = open("hello244", O_RDWR|O_CREAT|O_TRUNC, 0644);
if (fd < 0){
sys_err("open error");
}
/*
注意:由于mmap的参2是开辟文件大小的映射区,完美open时是一个新文件,
此时大小为0,所以必须保证文件大小充足才能成功调用mmap开辟映射区。
这就是下面两个方法的原因。
方法1
lseek(fd, 19, SEEK_END); //将文件下标移至19个字节
write(fd, "\0", 1); //往文件写0,补充结尾。19+1=20个字节
len = lseek(fd, 0, SEEK_END); //利用lseek的返回值获取当前文件下标即文件大小
printf("The length of file = %d\n", len);
*/
//方法2
ftruncate(fd, 20);//该函数和lseek+write作用一样
len = lseek(fd, 0, SEEK_END);
mem = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
if (mem == MAP_FAILED){
sys_err("mmap err: ");
}
//此时可以直接关闭描述符,因为mem已经代替其作用
close(fd);
//使用mem(内存)对磁盘文件进行读写操作。
strcpy(mem, "hello mmap");//写
printf("%s\n", mem);//读
if (munmap(mem, mem) < 0){
sys_err("munmap");
}
return 0;
}