linux 内存映射mmap


/*
   void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
//该函数把一个文件或一个posix共享内存区对象映射到调用进程的进程。
1.start:一般可以为NULL;
2.length:映射的字节大小;
3.prot:对映射存储的权限访问(PROT_NONE:不可访问;PROT_READ:可读;
PROT_WRITE:可写;PROT_EXEC:可执行);
4.flags:MAP_FIXED、MAP_SHARED(对内存的操作同样影响文件)、MAP_PRIVATE
5.文件描述附
6.要偏移的位置(SEEK_SET、SEEK_CUR、SEEK_END)

int munmap(void *start, size_t length);
//该函数用于取消映射
 */





001 #include <sys/types.h>
002 #include <sys/stat.h>
003 #include <fcntl.h>
004 #include <stdio.h>
005 #include <sys/mman.h>
006 #include <string.h>
007 #include <errno.h>
008 #include <unistd.h>
009  
010 /*
011    void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
012 //该函数把一个文件或一个posix共享内存区对象映射到调用进程的进程。
013 1.start:一般可以为NULL;
014 2.length:映射的字节大小;
015 3.prot:对映射存储的权限访问(PROT_NONE:不可访问;PROT_READ:可读;
016 PROT_WRITE:可写;PROT_EXEC:可执行);
017 4.flags:MAP_FIXED、MAP_SHARED(对内存的操作同样影响文件)、MAP_PRIVATE
018 5.文件描述附
019 6.要偏移的位置(SEEK_SET、SEEK_CUR、SEEK_END)
020  
021 int munmap(void *start, size_t length);
022 //该函数用于取消映射
023  */
024  
025 #define FILENAME1 "./lhw1"
026 #define FILENAME2 "./lhw2"
027 #define OPEN_FLAG O_RDWR|O_CREAT
028 #define OPEN_MODE 00777
029 #define FILE_SIZE 4096*4
030  
031 static int my_mmap(int dst, int src)
032 {
033     int ret = -1;
034     void* add_src = NULL;
035     void* add_dst = NULL;
036     struct stat buf = {0};
037  
038     //获取打开文件的详细信息(主要要取得读文件的大小)
039     ret = fstat(src, &buf);
040     if(-1 == ret)
041     {
042         perror("fstat failed: ");
043         goto _OUT;
044     }
045     //映射源文件的存储区
046     add_src = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, src, SEEK_SET);
047     if(NULL == add_src)
048     {
049         perror("mmap src failed: ");
050         goto _OUT;
051     }
052  
053     //lseek dst(制造文件空洞,使其有一定大小,没有大小会出错)
054     ret = lseek(dst, buf.st_size, SEEK_SET);
055     if(-1 == ret)
056     {
057         perror("lseek dst faile: ");
058         goto _OUT;
059     }
060     //write dst
061     ret = write(dst, "w", 1);
062     if(-1 == ret)
063     {
064         perror("write dst faile: ");
065         goto _OUT;
066     }
067  
068     //映射目标文件的存储区
069     add_dst = mmap(NULL, buf.st_size, PROT_WRITE, MAP_SHARED, dst, SEEK_SET);
070     if(NULL == add_dst)
071     {
072         perror("mmap src failed: ");
073         goto _OUT;
074     }
075  
076     //memcpy 将源文件内存add_src的内容拷贝到目标文件add_dst,通过内存共享
077     memcpy(add_dst, add_src, buf.st_size);
078      
079     //取消映射
080     ret = munmap(add_src, buf.st_size);
081     if(-1 == ret)
082     {
083         perror("munmap src faile: ");
084         goto _OUT;
085     }
086     ret = munmap(add_dst, buf.st_size);
087     if(-1 == ret)
088     {
089         perror("munmap dst faile: ");
090         goto _OUT;
091     }
092  
093 _OUT:
094     return ret;
095 }
096  
097 int main(void)
098 {
099     int ret = -1;
100     int fd1 = -1;
101     int fd2 = -1;
102  
103     //open fd1
104     fd1 = open(FILENAME1, OPEN_FLAG, OPEN_MODE);
105     if(-1 == (ret = fd1))
106     {
107         perror("open fd1 failed: ");
108         goto _OUT;
109     }
110     //write fd1
111     ret = write(fd1, "howaylee"sizeof("howaylee"));
112     if(-1 == ret)
113     {
114         perror("write failed: ");
115         goto _OUT;
116     }
117     //open fd2
118     fd2 = open(FILENAME2, OPEN_FLAG, OPEN_MODE);
119     if(-1 == (ret = fd2))
120     {
121         perror("open fd2 failed: ");
122         goto _OUT;
123     }
124     //mmap
125     my_mmap(fd2, fd1);
126  
127 _OUT:  
128     return ret;
129 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值