博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用mmap在内存中读写文件
阅读量:5112 次
发布时间:2019-06-13

本文共 1336 字,大约阅读时间需要 4 分钟。

通常情况下是使用read/write,fread/fwrite等来读写文件,linux提供了一种方式可以将文件映射到内存,然后可以用字符串的方式对它进行读写操作,并写回到文件。 

下面是一段测试代码,目的: 用mmap将文件abc.txt映射到内存,利用字符串函数向该内存中插入一个字符串,以达到修改文件的目的。

 

 

 #include <stdio.h>

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <
string.h>
#define handle_error(msg) do{perror(msg);exit(EXIT_FAILURE);} while(0)
int main(
int argc, 
char *argv[])
{
        
int fd;
        off_t length;
        
char *addr;
        
char *inserted = 
"
## inserted ##
"
//
 this str will be inserted to the file
        
int pos = 
5
//
 the position to insert
        fd = open(
"
abc.txt
", O_RDWR | O_CREAT, 
0644);
        
if(fd == -
1)
        {
                handle_error(
"
open file error
");
        }
        length = lseek(fd, 
1, SEEK_END);
        write(fd, 
"
\0
"
1);
        addr = (
char *)mmap(NULL, length + strlen(inserted), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 
0);
        memcpy(addr + pos + strlen(inserted), addr + pos, length - pos);
        memcpy(addr + pos, inserted, strlen(inserted));
        
//
printf("addr: %s", addr);
        close(fd);
        munmap((
void *)addr, length);
}

 

运行:

zhangxd@ubuntu:~/linux$ cat abc.txt 
This is the first message.
zhangxd@ubuntu:~/linux$ ./test 
zhangxd@ubuntu:~/linux$ cat abc.txt 

This ## inserted ##is the fir 

 

可以看到文件内容已经被修改了,细心的朋友会发现,mmap时申请的长度大于文件的长度,但是最终文件的长度并没有改变,由此得出结论:mmap是不能修改文件的长度的。 

转载于:https://www.cnblogs.com/java-koma/archive/2012/12/01/2797226.html

你可能感兴趣的文章
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>