mmap函数可能出现的问题
2017-03-16 18:27
134 查看
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并不能使映射的内容写回磁盘
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(958) | 评论(0) | 转发(2) |
0
上一篇:C 强制类型转换
下一篇:sprintf函数用法解析
相关热门文章
linux 常见服务端口
xmanager 2.0 for linux配置
【ROOTFS搭建】busybox的httpd...
openwrt中luci学习笔记
什么是shell
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
关于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并不能使映射的内容写回磁盘
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(958) | 评论(0) | 转发(2) |
0
上一篇:C 强制类型转换
下一篇:sprintf函数用法解析
相关热门文章
linux 常见服务端口
xmanager 2.0 for linux配置
【ROOTFS搭建】busybox的httpd...
openwrt中luci学习笔记
什么是shell
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- mmap函数大文件读写可能出现的问题
- matlab中textread()函数使用过程中可能出现的问题
- Runtime error 可能是scanf函数出现问题 poj3630
- 应聘Java笔试时可能出现问题及其答案
- Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题及其答案
- 应聘Java笔试时可能出现问题及其答案
- DNN3.3/4.3升级可能出现的问题及解决方法
- 应聘Java笔试时可能出现问题及其答案
- 有感:应聘Java笔试时可能出现问题及其答案(第二版part four)
- 使用exec启动其他进程时可能出现的问题
- 有感:应聘Java笔试时可能出现问题及其答案
- 有感:应聘Java笔试时可能出现问题及其答案[转贴]
- Domino中Java代理循环可能出现问题
- VB中IIS Application发布可能出现的问题
- 一次调用ACTIVEX控件中出现的问题.不可访问构建函数.
- 简易HIS配置可能出现的问题
- 一个人出现问题可能是道德问题,但是很多人都有相同的问题就一定不是道德问题。