linux mmap

参考博客:

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *addr, size_t length);
int msync(void *addr, size_t length, int flags);

创建内存映射

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
@param addr:指定起始地址,一般都置为NULL,由系统选择映射的起始地址
@param length:指定期望的映射内存大小,实际大小往往以页大小边界左右(具体未知),但是肯定大于等于你期望大小。
@param prot:PROT_EXEC ,PROT_READ ,PROT_WRITE ,PROT_NONE
@param flags:常用的MAP_SHARED和MAP_PRIVATE

  • MAP_PRIVATE:映射的更新对映射相同文件的其他进程不可见,并且不更新底层文件
  • MAP_SHARED:映射的更新对映射此文件的其他进程可见,并更新到底层文件。在调用msync(2) 或munmap()之前,文件可能不会实际更新。

@parma offset:映射文件的偏移地址,必须是page(sysconf(_SC_PAGESIZE))的整数倍。
映射完成之后就可以关闭文件了。

下面创建一个完整的内存映射,并且查看内容

int main()
   12 {
   13     int f = open("a.txt",O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);
   14     if (f < 0)
   15     {16         printf(strerror(errno));
   17         printf("file open failed\n");
   18         return 0;
   19     }
   20 
   21     int page_size = sysconf(_SC_PAGESIZE);
   22     printf("page size:%d\n",page_size);
   23 
   24     char *ptext =(char *) mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,f,page_size);
   25 	  close(f);//映射完成之后就可以关闭文件了 	
   26     if(ptext != (void *)-1)
   27     {28         printf("content len:%d\n",strlen(ptext));
   29 //      printf("content:%s\n",ptext);
   30     }
   31     else
   32     {
   33         printf("mmap error:%s\n",strerror(errno));
   34         return 0;
   35     }
   36 
   37     strcpy(ptext,"wwwwwww");                                                                                                                                                           
   38 
   39     int ival = msync(ptext,20,0);
   40     printf("msync ret:%d\n",ival);
   41 
   42     ival = munmap(ptext,20);
   43     printf("munmap ret:%d\n",ival);
   44     return 0;
   45 }

上面demo中我们实际期望数据是20,但是实际远远大于(demo使用的是文本文件方便测试)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值