利用mmap实现的一个文件拷贝例子,供大家参考,具体内容如下

/*

* gcc -Wall -O3 -o copy_mmap copy_mmap.c

*/

#include < stdio.h >

#include < stdlib.h >

#include < string .h > /* for memcpy */

#include < strings.h >

#include < sys / mman.h >

#include < sys / types.h >

#include < sys / stat.h >

#include < fcntl.h >

#include < unistd.h >

#define PERMS 0600

int main ( int argc, char * argv[] )

{

int src, dst;

void * sm, * dm;

struct stat statbuf;

if ( argc != 3 )

{

fprintf( stderr, " Usage: %s \n " , argv[ 0 ] );

exit( EXIT_FAILURE );

}

if ( ( src = open( argv[ 1 ], O_RDONLY ) ) < 0 )

{

perror( " open source " );

exit( EXIT_FAILURE );

}

/* 为了完成复制,必须包含读打开,否则mmap()失败 */

if ( ( dst = open( argv[ 2 ], O_RDWR | O_CREAT | O_TRUNC, PERMS ) ) < 0 )

{

perror( " open target " );

exit( EXIT_FAILURE );

}

if ( fstat( src, & statbuf ) < 0 )

{

perror( " fstat source " );

exit( EXIT_FAILURE );

}

/*

* 参看前面man手册中的说明,mmap()不能用于扩展文件长度。所以这里必须事

* 先扩大目标文件长度,准备一个空架子等待复制。

*/

if ( lseek( dst, statbuf.st_size - 1 , SEEK_SET ) < 0 )

{

perror( " lseek target " );

exit( EXIT_FAILURE );

}

if ( write( dst, & statbuf, 1 ) != 1 )

{

perror( " write target " );

exit( EXIT_FAILURE );

}

/* 读的时候指定 MAP_PRIVATE 即可 */

sm = mmap( 0 , ( size_t )statbuf.st_size, PROT_READ,

MAP_PRIVATE | MAP_NORESERVE, src, 0 );

if ( MAP_FAILED == sm )

{

perror( " mmap source " );

exit( EXIT_FAILURE );

}

/* 这里必须指定 MAP_SHARED 才可能真正改变静态文件 */

dm = mmap( 0 , ( size_t )statbuf.st_size, PROT_WRITE,

MAP_SHARED, dst, 0 );

if ( MAP_FAILED == dm )

{

perror( " mmap target " );

exit( EXIT_FAILURE );

}

memcpy( dm, sm, ( size_t )statbuf.st_size );

/*

* 可以不要这行代码

*

* msync( dm, ( size_t )statbuf.st_size, MS_SYNC );

*/

return ( EXIT_SUCCESS );

}

mmap()好处是处理大文件时速度明显快于标准文件I/O,无论读写,都少了一次用户空间与内核空间之间的复制过程。操作内存还便于设计、优化算法。

文件I/O操作/proc/self/mem不存在页边界对齐的问题,但至少Linux的mmap()的最后一个形参offset并未强制要求页边界对齐,如果提供的值未对齐,系统自动向上舍入到页边界上。malloc()分配得到的地址不见得对齐在页边界上。

/proc/self/mem和/dev/kmem不同。root用户打开/dev/kmem就可以在用户空间访问到内核空间的数据,包括偏移0处的数据,系统提供了这样的支持。显然代码段经过/proc/self/mem可写映射后已经可写,无须mprotect()介入。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

linux c mmap 写文件夹,利用mmap实现文件拷贝功能相关推荐

  1. linux遍历目录删除指定文件,利用shell脚本遍历文件夹内所有的文件并作整理统计的方法-linux删除文件夹...

    本篇文章扣丁学堂Linux培训小编给读者们分享一下利用shell脚本遍历文件夹内所有的文件并作整理统计的方法,文章具有很好的参考价值,感兴趣的小伙伴就随小编来了解一下吧. 环境: Ubuntu下采用s ...

  2. linux 循环显示所有的sh.*文件.,利用shell脚本遍历文件夹内所有的文件并作整理统计的方法...

    环境: Ubuntu下采用shell脚本实现 案例简述:文件夹内有许多子文件夹,这里需要自动读取所有的文件,包括他们的地址和文件名.通过观察文件名的规律,按照一定的规则裁剪出文件名的某一部分,该部分为 ...

  3. beyond compare linux文件夹,Beyond Compare比较文件夹的方法

    Beyond Compare是文本对比工具的佼佼者,十分易用.它可以比较两个文件夹,可以让你做3-way文件比较.Beyond Compare有Windows.Linux.OSX版本,新版本是Beyo ...

  4. Linux 中如何复制和删除文件夹中的所有文件?

    Linux 中如何复制和删除文件夹中的所有文件? 1.复制文件 目标文件目录必须存在 (1) 直接复制 cp /hone/user/temp/test.c /home/user/ (2) 复制并重命名 ...

  5. linux挂载一个文件夹,linux挂载一个文件夹到另一个文件夹

    linux 挂载一个文件夹到另一个文件夹 Most Linux and Unix file systems don't allow hard links to directories (except ...

  6. Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限

    一台老的PHP后台服务器,今天用 free -m 查看,发现内存跑满了. 再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一 ...

  7. linux怎么复制文件夹全部内容,linux局域网怎么复制文件夹下的全部文件到另外文件夹...

    在Linux系统局域网中复制或拷贝文件我们可以用cp或者copy命令,但要对一个文件夹中的全部文件复制到另外一个文件夹中去,如何进行操作呢?linux局域网复制文件夹下的全部文件到另外文件夹的方法其实 ...

  8. mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...

  9. 利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

    2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm ...

最新文章

  1. ProtoBuf使用笔记
  2. vue 如何判断两个数组相同_如何判断车头与障碍物的距离,教你两个办法,轻松靠墙10公分...
  3. SpringBoot使用security和jwt进行鉴权设计
  4. 解决 echarts柱状图x轴数据隔一个显示
  5. 虚拟机下CentOS7开启SSH连接
  6. Oracle基础中的基础视频讲座录像(西安)供免费下载
  7. android自定义push通知_Android自定义Notification的一些坑
  8. 数据转换之 Number
  9. 计算机网络(八)——web的工作原理
  10. 2017年SEO推广优化怎么做
  11. API3价格流将与Omen预测市场进行集成
  12. Logstash+Kibana+多ElasticSearch集群部署
  13. leetcode942. DI String Match
  14. 记录一次nginx502/504问题解决过程
  15. maven的基本用法
  16. [AHK]--显示器输入源快速切换
  17. MySQL安装及应用合集(4):MySQL库表基本操作-增删改查
  18. 主数据管理项目建设经验分享
  19. 基因组Denovo组装原理、软件、策略及实施
  20. nodejs抓取https://themeforest.net网页

热门文章

  1. vue 集成腾讯地图基础api Demo集合
  2. “灾难无情人有情”:备战金三银四之微服务架构问题!(含解析)
  3. 手机显示屏TFT LCD分类
  4. 首先从键盘上两个矩阵的行数n和列数m,然后输入两个矩阵A和B的元素值,最后求出两个矩阵的和C并输出其元素值。
  5. jQuery翻页yunm.pager.js,涉及div局部刷新
  6. WiseBrowser 1.0震撼上市 创造移动浏览器巅峰神话
  7. Windows环境搭建WeGame饥荒专用服务器(详细版)
  8. 为什么减肥容易失败?
  9. 在某高层建筑物中只有一部电梯,由N个正整数组成一个请求序列,列表中的数字表示电梯将在哪层停,电梯按列表顺序依次停靠电梯每上行一层需要花6秒时间,每下行一层需要花4秒时间,电梯每停一次需要用时5秒。
  10. 物联网平台通信协议之 MQTT 协议