linux-內存映像

轉載請註明出處: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)  


flg用於設置是否在需要移動內存鏡像時移動該鏡像。如: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;      
  31. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章