Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852750
  • 博文数量: 317
  • 博客积分: 1557
  • 博客等级: 上尉
  • 技术积分: 1208
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-26 23:38
个人简介

如果想出发,就不要等到明天!

文章分类

全部博文(317)

文章存档

2016年(1)

2015年(41)

2014年(152)

2013年(114)

2012年(4)

2011年(1)

2009年(4)

分类: LINUX

2013-06-13 19:35:37

原文地址:mmap系统调用 作者:下雨夜

void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset)
负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改。
addr:指定文件映射到虚拟地址空间的起始地址。一般为空,由系统指定。
len:虚拟地址空间的长度
prot:映射区的保护方式
PROT_EXEC:映射区可被执行
PROT_READ:映射区可被读取
PROT_WRITE:映射区可别写入
flags:映射区的特性
MAP_SHARED:写入映射区的数据会复制回文件,且允许其他映射该文件的进程共享。
MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会
影响源文件。
fd:文件描述符
offset:偏移量

int munmap(void *start,size_t length)
解除映射,start为映射区的起始地址,length为映射区的长度。

#include
#include
#include
#include
#include
#include
#include
#include

#define err_exit(str)   do{perror(str);return -1;}while(0);

int main(int argc,char *argv[])
{
   int fd_in,fd_out;
   void *src,*dst;
   struct stat statbuf;

   if (argc != 3)
       err_exit("Arguement error.");

   if((fd_in = open(argv[1],O_RDONLY)) < 0)
       err_exit("Open file1 fail.");

   if((fd_out = open(argv[2],O_RDWR|O_TRUNC)) < 0)
       err_exit("Open file2 fail.");

   if(fstat(fd_in,&statbuf) < 0)
       err_exit("fstat fail.");
   
   ftruncate(fd_out,statbuf.st_size);

   if ((src = mmap(NULL,statbuf.st_size,PROT_READ,MAP_SHARED,fd_in,0)) == MAP_FAILED)
       err_exit("mmap1 fail:");

   if ((dst = mmap(NULL,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_out,0)) == MAP_FAILED)
       err_exit("mmap2 fail:");
 
   memcpy(dst,src,statbuf.st_size);
   munmap(src,statbuf.st_size);
   munmap(dst,statbuf.st_size);
   return 0;
}


阅读(1280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~