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. eclipse package,source folder,folder区别及相互转换

    今天遇到一个问题:在com.a.b.c这个包路径下建一个package,但是不知为什么就会自动编程folder,而且在这个“package”下的所有property文件读不到.所以看了一下文章:在ec ...

  2. HibernateTemplate的find(String querystring)返回值具体解释

    项目源代码中出现例如以下代码: HibernateTemplate ht =-- List<Object[]> tempList = ht.find(String querystring) ...

  3. [每日一题] OCP1z0-047 :2013-08-12 view视图的描述哪些是正确的?

    正确答案是: CE 这是OCP教材中的: 1.简单视图与复杂视图的定义: 2.复杂视图通常不能被DML: .WITH CHECKOP TIONT选项 A不正确.简单视图可以被更新. hr@OCM> ...

  4. (linux shell)第一章--小试牛刀(上)

    来源:(linux shell)第一章--小试牛刀(上) 从今天開始,我们一起来学习<linux shell脚本攻略>这本书. 1.1简单介绍 shell脚本一般是一个以#!起始的文本文件 ...

  5. JavaBean中DAO设计模式介绍(转)

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  6. C# DataTable怎么合计字段

    DataTable dt = new DataTable(); var age=dt.Compute("avg(age)",""); var height =d ...

  7. Managing Group Policy with PowerShell

    Overview In this article, I’ll talk about your options when it comes to managing Group Policy using ...

  8. MKServerBuilder.psm1

    MKServerBuilder.psm1 function Test-ElevatedShell { $user = [Security.Principal.WindowsIdentity]::Get ...

  9. BZOJ 1044 木棍分割

    二分+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...

  10. Jquery Call WebDav

    最近研究了一下WebDav,尝试了一下用Jquery.ajax 发生请求访问WebDav. 代码如下: <!DOCTYPE html> <html xmlns="http: ...