mmap内存映射复习
c语言初学时,比较常见的一个习题就是实现cp。
使用c库实现的cp就不赘述了。
最近工作用到内存映射,就拿来练下手,复习一下mmap的用法。
很简单,将目标文件和源文件映射到内存,然后使用memcpy拷贝即可。
可以省去中间缓存的创建,代码页较为简单,拷贝速度也不错。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h> #define COFYMODE 0666 int copy(const char* src, const char* dest)
{
int ret = -;
int in_fd = -, out_fd = -;
size_t filesize;
char nullbyte;
void *source_addr = NULL;
void *dest_addr = NULL; /* check args */
if(src == NULL || dest == NULL){
fprintf(stderr,"file path can not be null\n");
return ret;
} /* open files */
if((in_fd=open(src, O_RDONLY))==-) {
fprintf(stderr, "Cannot open %s\n", src);
return ret;
} #if defined(i386) || defined(__x86_64) || defined(__x86_64__) || defined(i686)
if((out_fd=open(dest, O_RDWR|O_CREAT|O_TRUNC,COFYMODE))==-)
{
fprintf(stderr, "Cannot open %s\n", dest);
ret = -;
goto cleanup;
}
#else
if((out_fd=open(dest, O_WRONLY|O_CREAT|O_TRUNC,COFYMODE))==-)
{
fprintf(stderr, "Cannot create %s\n", dest);
ret = -;
goto cleanup;
}
#endif if((filesize=lseek(in_fd,,SEEK_END))==-)
{
fprintf(stderr, "Could not seek to end of file %s\n", src);
ret = -;
goto cleanup;
} if(filesize == )
{
ret = ;
goto cleanup;
} lseek(out_fd,filesize-,SEEK_SET);
write(out_fd,&nullbyte,); /* setup the memory maps */
if((source_addr=mmap(NULL,filesize,PROT_READ,MAP_SHARED,in_fd,))==(void *)-)
{
fprintf(stderr, "Error mapping file %s\n", src);
ret = -;
goto cleanup;
} if((dest_addr=mmap(NULL,filesize,PROT_WRITE,MAP_SHARED,out_fd,))==(void *)-)
{
fprintf(stderr, "Error mapping file %s\n", dest);
ret = -;
goto cleanup;
} /* copy the input to output by doing a memcpy */
memcpy(dest_addr,source_addr,filesize); cleanup:
/*unmap the fiels */
if(source_addr) munmap(source_addr,filesize);
if(dest_addr) munmap(dest_addr,filesize); /* close the files */
if(in_fd > )close(in_fd);
if(out_fd > ) close(out_fd); return ret;
} int main(int argc, char* argv[])
{
if(argc < )
{
fprintf(stderr, "useage: %s src_file dest_file", argv[]);
return -;
} return copy(argv[], argv[]);
}
mmap内存映射复习的更多相关文章
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- 【转】Python之mmap内存映射模块(大文本处理)说明
[转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...
- mmap内存映射
http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...
- linux mmap 内存映射
mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...
- sendfile“零拷贝”和mmap内存映射
在学习sendfille之前,我们先来了解一下浏览器访问页面时,后台服务器的大致工作流程. 下图是从用户访问某个页面到页面的显示这几秒钟的时间当中,在后台的整个工作过程. 如上图,黑色箭头所示的过程, ...
- Python之mmap内存映射模块(大文本处理)说明
背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...
- [转载]Linux驱动mmap内存映射
原文地址:https://www.cnblogs.com/wanghuaijun/p/7624564.html mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法 ...
- Linux驱动mmap内存映射
mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED).LCD控制器.磁盘控制器,实际上就是往设备的物理地址读写数据. ...
- 共享内存之——mmap内存映射
共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过sy ...
随机推荐
- leetcode第一刷_Triangle
非常easy的一道DP,看到空间限制是O(N)的,不要习惯性的以为是要保存每一行的最小值,不难想到是要保存一行其中各个数为路径终点时的和的大小.当算到最后一行时,就是从顶部究竟部以这个底部位置为终点的 ...
- mysql查询随机几条数据(速度快)
MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE i ...
- Visual Studio Package 插件开发
背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...
- Codeforces 417E Square Table(随机算法)
题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...
- String类的基本用法与注意点,StringBuffer类的用法
package cn.hncu.day8; public class RegExpDemo { public static void main(String[] args) { String str ...
- 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了
为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了
- JDK1.8聚合操作
在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果.这些聚合操作被称为聚合操作.JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个c ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- EditPlus 快捷键
FileFtpUpload Ctrl+Shift+S 上传文件到 FTP 服务器 FileNew Ctrl+N 新建普通的文本文档 Fi ...
- 来讲讲C#中的类
1.什么是类? 面向对象的语言,最基本的就是类.在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象. 举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人.我们要找个人一起 ...