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;
}
阅读(2370) | 评论(0) | 转发(1) |