記憶體映像其實就是在記憶體中建立一個和外存檔案完全相同的映像。使用者可以將整個檔案對應到記憶體中也可以部分映射到記憶體。系統會將對記憶體映像的改動如實的反映到外存檔案中。從而實現了通過記憶體映像對外存檔案的操作。
記憶體映像的特點:
1、可以加快對IO的操作速度。
2、使用者可以通過指標對檔案進行操作,間接~~~
3、實現了檔案資料的共用,將外存檔案對應到共用記憶體中,很方便的實現了資料共用,並能完成把資料儲存到外存的工作。
註:記憶體映像只能對內部可以定位的檔案進行操作,如普通檔案。不能對管道,通訊端檔案進行操作。
建立記憶體映射:
#include<sys/types.h> #include<sys/mman.h> 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表示所映像的內容距檔案頭的距離。
撤銷記憶體映射:
#include<sys/types.h> #include<sys/mman.h> int munmap(void *start,size_t length);
改變記憶體屬性:
修改保護值:
int protect(const void *addr,size_tlength,int prot);
addr表示地址和上面相同。
length記憶體映像大小同上。
prot重新設定的保護值。
成功返回0失敗返回-1
修改記憶體鏡像大小:
void *mremap(void *old_addr,size_told_length,size_t new_length,unsigned long *flag)
flg用於設定是否在需要移動記憶體鏡像時移動該鏡像。如:MRMAP_MAYMOVE
調用成功返回新的起始地址,失敗返回-1
程式如下:
#include <stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<sys/mman.h> int main() { int fd; char *start; char buf[100]; /*開啟檔案*/ fd = open("testfile",O_RDWR); start=mmap(NULL,lseek(fd,0,SEEK_END),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); /* 讀出資料 */ strcpy(buf,start); printf("mmap = %s\n",buf); /* 寫入資料 */ strcpy(start,"Buf Is Not Null!"); printf("mmap:%s\",start); munmap(start,100); /*解除映射*/ close(fd); return 0; }
查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm