linux c mmap 写文件夹,利用mmap实现文件拷贝功能
利用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实现文件拷贝功能相关推荐
- linux遍历目录删除指定文件,利用shell脚本遍历文件夹内所有的文件并作整理统计的方法-linux删除文件夹...
本篇文章扣丁学堂Linux培训小编给读者们分享一下利用shell脚本遍历文件夹内所有的文件并作整理统计的方法,文章具有很好的参考价值,感兴趣的小伙伴就随小编来了解一下吧. 环境: Ubuntu下采用s ...
- linux 循环显示所有的sh.*文件.,利用shell脚本遍历文件夹内所有的文件并作整理统计的方法...
环境: Ubuntu下采用shell脚本实现 案例简述:文件夹内有许多子文件夹,这里需要自动读取所有的文件,包括他们的地址和文件名.通过观察文件名的规律,按照一定的规则裁剪出文件名的某一部分,该部分为 ...
- beyond compare linux文件夹,Beyond Compare比较文件夹的方法
Beyond Compare是文本对比工具的佼佼者,十分易用.它可以比较两个文件夹,可以让你做3-way文件比较.Beyond Compare有Windows.Linux.OSX版本,新版本是Beyo ...
- Linux 中如何复制和删除文件夹中的所有文件?
Linux 中如何复制和删除文件夹中的所有文件? 1.复制文件 目标文件目录必须存在 (1) 直接复制 cp /hone/user/temp/test.c /home/user/ (2) 复制并重命名 ...
- linux挂载一个文件夹,linux挂载一个文件夹到另一个文件夹
linux 挂载一个文件夹到另一个文件夹 Most Linux and Unix file systems don't allow hard links to directories (except ...
- Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
一台老的PHP后台服务器,今天用 free -m 查看,发现内存跑满了. 再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一 ...
- linux怎么复制文件夹全部内容,linux局域网怎么复制文件夹下的全部文件到另外文件夹...
在Linux系统局域网中复制或拷贝文件我们可以用cp或者copy命令,但要对一个文件夹中的全部文件复制到另外一个文件夹中去,如何进行操作呢?linux局域网复制文件夹下的全部文件到另外文件夹的方法其实 ...
- mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...
LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...
- 利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件
2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm ...
最新文章
- ProtoBuf使用笔记
- vue 如何判断两个数组相同_如何判断车头与障碍物的距离,教你两个办法,轻松靠墙10公分...
- SpringBoot使用security和jwt进行鉴权设计
- 解决 echarts柱状图x轴数据隔一个显示
- 虚拟机下CentOS7开启SSH连接
- Oracle基础中的基础视频讲座录像(西安)供免费下载
- android自定义push通知_Android自定义Notification的一些坑
- 数据转换之 Number
- 计算机网络(八)——web的工作原理
- 2017年SEO推广优化怎么做
- API3价格流将与Omen预测市场进行集成
- Logstash+Kibana+多ElasticSearch集群部署
- leetcode942. DI String Match
- 记录一次nginx502/504问题解决过程
- maven的基本用法
- [AHK]--显示器输入源快速切换
- MySQL安装及应用合集(4):MySQL库表基本操作-增删改查
- 主数据管理项目建设经验分享
- 基因组Denovo组装原理、软件、策略及实施
- nodejs抓取https://themeforest.net网页
热门文章
- vue 集成腾讯地图基础api Demo集合
- “灾难无情人有情”:备战金三银四之微服务架构问题!(含解析)
- 手机显示屏TFT LCD分类
- 首先从键盘上两个矩阵的行数n和列数m,然后输入两个矩阵A和B的元素值,最后求出两个矩阵的和C并输出其元素值。
- jQuery翻页yunm.pager.js,涉及div局部刷新
- WiseBrowser 1.0震撼上市 创造移动浏览器巅峰神话
- Windows环境搭建WeGame饥荒专用服务器(详细版)
- 为什么减肥容易失败?
- 在某高层建筑物中只有一部电梯,由N个正整数组成一个请求序列,列表中的数字表示电梯将在哪层停,电梯按列表顺序依次停靠电梯每上行一层需要花6秒时间,每下行一层需要花4秒时间,电梯每停一次需要用时5秒。
- 物联网平台通信协议之 MQTT 协议