在Linux系统mmap函数可能存在的问题
mmap函数实现文件映射到一个内存区域,这样我们可以读取和写入文件像读写内存,这比简单地调用读/ write.at有点快得多,我们可以将内存的内容到一个文件中实现存储备份,和,当然,地图文件的内容记忆恢复一些服务。此外,共享内存的mmap的实现是其一个主要的应用程序,和mmap系统调用使过程映射相同的普通文件的共享内存。对于mmap的内容,请看unix环境高级编程12章。在这里,谈论你可能会遇到使用mmap函数时出现的问题:
/ /下面的代码在1.ls文件内容通过mmap函数为2.ls,忽略错误处理
打开()1。
int FD2 =开放(2.ls,o_creat | o_rdwr | o_trunc,s_irusr | s_iwusr); / /读写权限必须设置,如果只写权限,将产生SIGSEGV信号
/ / mmap必须先读取文件时,它被映射。
统计结构;
fstat(FD,ST);
Lseek(FD2 st.st_size-1,seek_set);
写(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);
关闭(FD);关闭文件仍然可以修改文件的内容。
关闭(FD2);
Memcpy(_des,_src,st.st_size);
总之,可能出现的问题如下:
1。对于映射文件描述符必须具有读权限,否则将产生SIGSEGV信号
当2。内存内容写入映像文件,我们必须确保到文件的当前位置的长度不小于书面内容的长度,否则将产生SIGBUS信号。
三.关闭文件描述符并不能保证文件的内容没有被修改。
4.munmap不写回磁盘映射的内容