设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

linux c ---内存映像那些事

2012-5-29 15:47| 发布者: 红黑魂| 查看: 3662| 评论: 0|来自: csdn博客

摘要: 转载请注明出处:http://blog.csdn.net/muge0913/article/details/7315197 内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的 ...

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7315197

内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。

 

内存映像的特点:

1、 可以加快对IO的操作速度。

2、 用户可以通过指针对文件进行操作,间接~~~

3、 实现了文件数据的共享,将外存文件映射到共享内存中,很方便的实现了数据共享,并能完成把数据保存到外存的工作。

 

注:内存映像只能对内部可以定位的文件进行操作,如普通文件。不能对管道,套接字文件进行操作。

 

 

创建内存映射:

  1. #include<sys/types.h>   
  2.   
  3. #include<sys/mman.h>   
  4.   
  5. void *mmap(void *start,size_t length,intport,int flag,int fd,off_t offset)  

 

start为指针通常设为NULL,表示映射内存有系统决定。因为指定内存会经常出错。

length为内存映像占用的内存空间大小。以字节为单位。

port表示内存映像的安全性。

PROT_EXEC表示被映像内存可能有机器码,可执行。

PORT_NONE表示被映像内存不能被访问。

PORT_READ表示被映像内存可读

PORT_WRITE表示被映像内存可写


flag内存映像标志:

MAP_FIXED表示如果无法从start地址建立内存映像,则出错返回。

MAP_PRIVATE表示对内存映像进行的改动不反映到外存文件中。

MAP_SHARED表示对内存映像进行的改动反映到外存文件中。

fd文件描述符

offset表示所映像的内容距文件头的距离。

撤销内存映射:

  1. #include<sys/types.h>   
  2.   
  3. #include<sys/mman.h>   
  4.   
  5. int munmap(void *start,size_t length);  

 改变内存属性:

修改保护值:

  1. int protect(const void *addr,size_tlength,int prot);  

addr表示地址和上面相同。

length内存映像大小同上。

prot重新设定的保护值。

成功返回0失败返回-1

修改内存镜像大小:

  1. void *mremap(void *old_addr,size_told_length,size_t new_length,unsigned long *flag)  


{敏感词}用于设置是否在需要移动内存镜像时移动该镜像。如:MRMAP_MAYMOVE

调用成功返回新的起始地址,失败返回-1


程序如下:

 

  1.  #include <stdio.h>   
  2. #include<sys/types.h>   
  3. #include<sys/stat.h>   
  4. #include<fcntl.h>   
  5. #include<unistd.h>   
  6. #include<sys/mman.h>   
  7.   
  8. int main()  
  9. {  
  10.     int fd;  
  11.     char *start;  
  12.     char buf[100];  
  13.       
  14.     /*打开文件*/  
  15.     fd = open("testfile",O_RDWR);  
  16.           
  17.     start=mmap(NULL,lseek(fd,0,SEEK_END),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);  
  18.       
  19.     /* 读出数据 */  
  20.     strcpy(buf,start);  
  21.     printf("mmap = %s\n",buf);      
  22.   
  23.     /* 写入数据 */  
  24.     strcpy(start,"Buf Is Not Null!");  
  25.     printf("mmap:%s\",start);  
  26.       
  27.     munmap(start,100); /*解除映射*/  
  28.     close(fd);    
  29.       
  30.     return 0;      


酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部