mmap函数大文件读写可能出现的问题
2012-03-16 15:02
549 查看
转载:http://www.chineselinuxuniversity.net/articles/41953.shtml
-------------------------------------------------------------------------
mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。
关于mmap的内容请看《Unix环境高级编程》12章。在这里,说一下使用mmap函数时可能遇到的问题:
//下面的代码把文件1.ls中的内容通过mmap函数写入2.ls中,忽略出错处理
int fd=open("1.ls",O_RDONLY);
int fd2=open("2.ls",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);//必须设置读写权限,若只有写权限,会产生SIGSEGV信号
//mmap进行文件映射时必须先读取文件`
struct stat st;
fstat(fd,&st);
lseek(fd2,st.st_size-1,SEEK_SET);
write(fd2,"",1); //必须的,如果不设置,当写入数据的时候会遇到文件结束符,产生SIGBUS信号
void *_src=mmap(NULL,st.st_size,PROT_READ,MAP_SHARED, fd,0);
void *_des=mmap(NULL,st.st_size,PROT_WRITE,MAP_SHARED,fd2,0);
close(fd); //关闭文件后 依然可修改文件内容
close(fd2);
memcpy(_des,_src,st.st_size);
总结一下,可能产生的问题如下:
1.进行文件映射的描述符必须拥有读权限,否则会产生SIGSEGV信号
2.把内存内容写入映射文件时,必须确保被写文件当前位置到文件结尾的长度不小于所写内容长度,否则产生SIGBUS信号
3.关闭文件描述符并不能保证文件内容不被修改
4.munmap并不能使映射的内容写回磁盘
-------------------------------------------------------------------------
mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。
关于mmap的内容请看《Unix环境高级编程》12章。在这里,说一下使用mmap函数时可能遇到的问题:
//下面的代码把文件1.ls中的内容通过mmap函数写入2.ls中,忽略出错处理
int fd=open("1.ls",O_RDONLY);
int fd2=open("2.ls",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);//必须设置读写权限,若只有写权限,会产生SIGSEGV信号
//mmap进行文件映射时必须先读取文件`
struct stat st;
fstat(fd,&st);
lseek(fd2,st.st_size-1,SEEK_SET);
write(fd2,"",1); //必须的,如果不设置,当写入数据的时候会遇到文件结束符,产生SIGBUS信号
void *_src=mmap(NULL,st.st_size,PROT_READ,MAP_SHARED, fd,0);
void *_des=mmap(NULL,st.st_size,PROT_WRITE,MAP_SHARED,fd2,0);
close(fd); //关闭文件后 依然可修改文件内容
close(fd2);
memcpy(_des,_src,st.st_size);
总结一下,可能产生的问题如下:
1.进行文件映射的描述符必须拥有读权限,否则会产生SIGSEGV信号
2.把内存内容写入映射文件时,必须确保被写文件当前位置到文件结尾的长度不小于所写内容长度,否则产生SIGBUS信号
3.关闭文件描述符并不能保证文件内容不被修改
4.munmap并不能使映射的内容写回磁盘
相关文章推荐
- mmap函数可能出现的问题
- fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题
- 关于VS2010调试时出现的找不到可执行文件问题的可能的解决办法
- 头文件中写类的实现出现函数重复定义的问题
- Qt/C++中引用.c文件中函数出现的问题
- 每天一点Linux --- 解决Ubuntu下可能出现的zip文件乱码问题
- 在mac下配置tp5,出现文件读写权限的问题解决办法
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- C语言文件读写操作中缓冲区问题和setbuf函数详解
- matlab中textread()函数使用过程中可能出现的问题
- Java读写txt文件时防止中文乱码问题出现的方法介绍
- VMBox挂载共享文件时可能出现的问题以及对应的解决办法
- 安装SQL Server 2000时出现以下错误提示:“以前的某个程序安装已在安装计算机创建挂起的文件操作,运行安装程序之前必须重新启动计算机” 说明:如果重启计算机无法解决问题,可能有以下两个原因
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- fopen , fread fwrite 函数读写二进制文件 问题总结
- VS2008 中添加资源文件转为WinCE程序时可能出现的问题
- 文件内存映射mmap解决大文件快速读写问题
- 利用mysql来存储文件 LONGBLOB 可能出现的问题。
- 头文件中全局函数多次引用出现重定义的问题记录
- Mac本地集群上传文件可能出现的问题及解决方法