Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308780
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-08 20:07
文章分类

全部博文(94)

文章存档

2017年(19)

2016年(30)

2015年(12)

2014年(33)

我的朋友

分类: LINUX

2014-08-08 22:42:36

原文地址:mmap函数可能出现的问题 作者:刘一痕

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并不能使映射的内容写回磁盘
阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~