加载中…
个人资料
来一桶
来一桶
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,582
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

mmap

(2012-03-19 21:48:53)
标签:

杂谈

分类: linux系统编程


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#define FILENAME1 "./lhw1"
#define FILENAME2 "./lhw2"
#define OPEN_FLAG O_RDWR|O_CREAT
#define OPEN_MODE 00777
#define FILE_SIZE 4096*4

static int my_mmap(int dst, int src)
{
 int ret = -1;
 void* add_src = NULL;
 void* add_dst = NULL;
 struct stat buf = {0};

 //获取打开文件的详细信息(主要要取得读文件的大小)
 ret = fstat(src, &buf);
 if(-1 == ret)
 {
  perror("fstat failed: ");
  goto _OUT;
 }
 //映射源文件的存储区
 add_src = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, src, SEEK_SET);
 if(NULL == add_src)
 {
  perror("mmap src failed: ");
  goto _OUT;
 }

 //lseek dst(制造文件空洞,使其有一定大小,没有大小会出错)
 ret = lseek(dst, buf.st_size, SEEK_SET);
 if(-1 == ret)
 {
  perror("lseek dst faile: ");
  goto _OUT;
 }
 //write dst
 ret = write(dst, "w", 1);
 if(-1 == ret)
 {
  perror("write dst faile: ");
  goto _OUT;
 }

 //映射目标文件的存储区
 add_dst = mmap(NULL, buf.st_size, PROT_WRITE, MAP_SHARED, dst, SEEK_SET);
 if(NULL == add_dst)
 {
  perror("mmap src failed: ");
  goto _OUT;
 }

 //memcpy 将源文件内存add_src的内容拷贝到目标文件add_dst,通过内存共享
 memcpy(add_dst, add_src, buf.st_size);
 
 //取消映射
 ret = munmap(add_src, buf.st_size);
 if(-1 == ret)
 {
  perror("munmap src faile: ");
  goto _OUT;
 }
 ret = munmap(add_dst, buf.st_size);
 if(-1 == ret)
 {
  perror("munmap dst faile: ");
  goto _OUT;
 }

_OUT:
 return ret;
}

int main(void)
{
 int ret = -1;
 int fd1 = -1;
 int fd2 = -1;

 //open fd1
 fd1 = open(FILENAME1, OPEN_FLAG, OPEN_MODE);
 if(-1 == (ret = fd1))
 {
  perror("open fd1 failed: ");
  goto _OUT;
 }
 //write fd1
 ret = write(fd1, "howaylee", sizeof("howaylee"));
 if(-1 == ret)
 {
  perror("write failed: ");
  goto _OUT;
 }
 //open fd2
 fd2 = open(FILENAME2, OPEN_FLAG, OPEN_MODE);
 if(-1 == (ret = fd2))
 {
  perror("open fd2 failed: ");
  goto _OUT;
 }
 //mmap
 my_mmap(fd2, fd1);

_OUT: 
 return ret;
}

 


 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有