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内存映射复习的更多相关文章

  1. linux mmap 内存映射【转】

    转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...

  2. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  3. mmap内存映射

    http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...

  4. linux mmap 内存映射

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

  5. sendfile“零拷贝”和mmap内存映射

    在学习sendfille之前,我们先来了解一下浏览器访问页面时,后台服务器的大致工作流程. 下图是从用户访问某个页面到页面的显示这几秒钟的时间当中,在后台的整个工作过程. 如上图,黑色箭头所示的过程, ...

  6. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  7. [转载]Linux驱动mmap内存映射

    原文地址:https://www.cnblogs.com/wanghuaijun/p/7624564.html mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法 ...

  8. Linux驱动mmap内存映射

    mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED).LCD控制器.磁盘控制器,实际上就是往设备的物理地址读写数据. ...

  9. 共享内存之——mmap内存映射

    共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过sy ...

随机推荐

  1. 一个寻找.jar 和.zip文件中class文件的工具

    相信很多人跟我一样,苦于在各种包之间,不知道Class存在什么地方,为此,自己写了一个小工具,来寻找目录下的Class文件 支持 目录查询,支持带包路径查询 入口Entrance.java packa ...

  2. Ajax-$.ajax()方法详解

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  3. LVM物理卷命令

    1. 物理卷命令  一般维护命令:  #pvscan //在系统的全部磁盘中搜索已存在的物理卷  #pvdisplay 物理卷全路径名称 //用于显示指定物理卷的属性. #pvdata 物理卷全路径名 ...

  4. 15分钟弄懂 const 和 #define

    什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义 ...

  5. webservice 生成代理类

    webservice的调用方式有两种: 1. 直接在vs ide中通过web引用的方式,将发布于某个位置的web服务引进到工程里面.这种方式基本上会用vs.net的人都会.   2. 通过vs 命令提 ...

  6. Android低功耗蓝牙(BLE)开发的一点感受

    最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...

  7. Android - Binder驱动

      以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删): http://blog.csdn.net/luosh ...

  8. 当winform窗体的Bordestyle设置为None时,鼠标可以拖动窗体的办法

    方法一: 1 2015-07-11 16:05:35 Point formPoint;//记录窗体的位置 private void Form1_MouseDown(object sender, Mou ...

  9. C# 与 C++ 交互

    参考: http://www.cnblogs.com/liping13599168/archive/2011/03/31/2000320.html Platform Invoke Tutorial:h ...

  10. [GDI+] 生成缩略图的类文件SmallImage (转载)

    直接看代码吧,大家可以直接复制使用 /// <summary> /// 类说明:SmallImage类, /// 编码日期:2012-08-20 /// 编 码 人: 苏飞 /// 联系方 ...