mmap()函數用來將文件或者設備空間映射到內存中,可以通過對映射後的內存空間存取來獲得與存取文件一致的空制方式,不必再使用read()、write()函數。簡單的說此函數就是將文件映射到內存中的某一段。
1、 mmap()函數介紹
mmap()函數的原型如下:
#inlcude <sys/mman.h>
void *mmap(*start, size_t length, int prot, int flags, int fd, off_t offset);
它將文件描述符fd對應的文件中,自offset開始的一段長length的數據空間映射到內存中。用戶可以設定映射內存的地址,但是具體函數會映射到內存的位置由返回值確定。
使用mmap()函數有一個限制,只能對映射到內存的數據進行操作,即限制於開如爲offset、大小爲len的區域。注意不要越界操作。
mmap() 函數的參數prot,表示映射區保護方式。保護方式prot的值是一個組合值,可選如下的一個或者多個:
l PROT_EXEC 表示映射區域可執行
l PROT_READ 表示映射域可讀取
l PROT_WRITE 表示映射域可寫入
l PROT_NONE 表示映射域可寫入
注意:prot的設置受文件打開時的選項限制,當打開文件時爲只讀,則寫(PROT_WRITE)失效,但讀仍然有效。
參數flags用於設定映射對映的類型、選項和是否可以對映射對象進行操作(讀寫等),這個參數和open()函數中的含義類似。參數flags也是一個組合值,下面是其可選設置。
l MAP_FIXED:如果參數start指定了用於需要映射至的地址,而所指的地址無法成功建立映射,則映射失敗。通常不推薦使用此設置,而將start設爲0,由系統自動選取映射地址。
l MAP_SHARED:共享的映射區域,映射區域允許其他進程共享,對此映射區域寫入數據將會寫入到原來的文件中。
l MAP_PRIVATE:當對映射區域進行寫入操作時會產生一個映射文件的複製,即寫入複製(copy on write),而讀操作不會影響此複製。對此映射區的修改不會寫回原來的文件,即不會影響原來文件的內容。
l MAP_ANONYMOUS:建立匿映射。此時會忽略參數fd,不涉及文件,而且映射區域無法與其他進程共享。
l MAP_DENYWRITE:對文件的寫入操作將被禁止,只能通過對此映射區打哈哈物方式實現對文件的操作,不允許直接對文件進行操作。
l MAP_LOCKED:將映射區鎖定,此區域不會被虛擬內存重置。
注意:參數必須是MAP_PRIVATE或者MAP_SHARED二者之一的類型。
2、 munmap()函數介紹
與mmap()函數對應的函數是munmap()函數,它的作用是取消mmap()函數的映射關係。其函數原型如下:
#include <sys/mman.h>
int munmap(void *start, size_t length);
參數start爲mmap()函數功功後的返回值(即映射的內存地址);
參數length爲映射的長度。