函式:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 引數start:指向
函式:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
引數length:代表將檔案中多大的部分對映到記憶體。
引數prot:對映區域的保護方式。可以為以下幾種方式的組合:
prot_exec 對映區域可被執行
prot_read 對映區域可被讀取
prot_write 對映區域可被寫入
prot_none 對映區域不能訪問
引數flags:影響對映區域的各種特性。在呼叫mmap()時必須要指定map_shared 或map_private。
map_fixed 如果引數start所指的位址無法成功建立對映時,則放棄對映,不對位址做修正。通常不鼓勵用此旗標。
map_shared對對映區域的寫入資料會複製回檔案內,而且允許其他對映該檔案的程序共享, 原來的檔案會改變。
map_private 對對映區域的寫入操作會產生乙個對映檔案的複製,即私人的「寫入時複製」(copy on write)對此區域作的任何修改都不會寫回原來的檔案內容。當共享的物件的虛擬儲存區域為私有物件時, 修改只會被本程序中改變。
map_anonymous建立匿名對映。此時會忽略引數fd,不涉及檔案,而且對映區域無法和其他程序共享。
map_denywrite只允許對對映區域的寫入操作,其他對檔案直接寫入的操作將會被拒絕。
map_locked 將對映區域鎖定住,這表示該區域不會被置換(swap)。
引數fd:要對映到記憶體中的檔案描述符。如果使用匿名記憶體對映時,即flags中設定了map_anonymous,fd設為-1。有些系統不支援匿名記憶體對映,則可以使用fopen開啟/dev/zero檔案,然後對該檔案進行對映,可以同樣達到匿名記憶體對映的效果。
引數offset:檔案對映的偏移量,通常設定為0,代表從檔案最前方開始對應,offset必須是分頁大小的整數倍。
返回值:
若對映成功則返回對映區的記憶體起始位址,否則返回map_failed(-1),錯誤原因存於errno 中。
錯誤程式碼:
ebadf 引數fd 不是有效的檔案描述詞
eacces 訪問許可權有誤。如果是map_private 情況下檔案必須可讀,使用map_shared則要有prot_write以及該檔案要能寫入。
einval 引數start、length 或offset有乙個不合法。
eagain 檔案被鎖住,或是有太多記憶體被鎖住。
enomem 記憶體不足。
系統呼叫mmap()用於共享記憶體的兩種方式:
(1)使用普通檔案提供的記憶體對映:
適用於任何程序之間。此時,需要開啟或建立乙個檔案,然後再呼叫mmap()
典型呼叫程式碼如下:
fd=open(name, flag, mode); if(fd<0) ...
ptr=mmap(null, len , prot_read|prot_write, map_shared , fd , 0);
通過mmap()實現共享記憶體的通訊方式有許多特點和要注意的地方,可以參看unix網路程式設計第二卷。
(2)使用特殊檔案提供匿名記憶體對映:
適用於具有親緣關係的程序之間。由於父子程序特殊的親緣關係,在父程序中先呼叫mmap(),然後呼叫 fork()。那麼在呼叫fork()之後,子程序繼承父程序匿名對映後的位址空間,同樣也繼承mmap()返回的位址,這樣,父子程序就可以通過對映區 域進行通訊了。注意,這裡不是一般的繼承關係。一般來說,子程序單獨維護從父程序繼承下來的一些變數。而mmap()返回的位址,卻由父子程序共同維護。 對於具有親緣關係的程序實現共享記憶體最好的方式應該是採用匿名記憶體對映的方式。此時,不必指定具體的檔案,只要設定相應的標誌即可。
下面寫乙個demo:
#include #include #include #include void mmapcopy(int fd, int size)
int main(int argc, char **ar**)
//int fd = atoi(*ar**[1]);
//mmap()
int fd = open(ar**[1], o_rdwr, 0); // o_rdwr 才能被讀寫。
if (fd < 0)
fprintf(stderr, "open: %s\n", strerror(errno)); // 使用異常檢查是個好習慣, 他可以幫助程式設計師迅速定位出錯的地方!
fstat(fd, &stat);
mmapcopy(fd, stat.st_size);
//while(1);
close(fd);
exit(0);
mmap函式的用法
mmap函式的用法 2005 11 06 09 14 分類 c c 改自wrox linux程式設計 include include include include include typedef struct record define nrecords 100 int main fclose f...
Linux中mmap函式的使用
linux利用mmap函式允許程式建立共享記憶體,建立一段可以被多個程式讀寫的記憶體,乙個程式的修改可以被其他程式看見。還可以用在檔案的處理上,通過帶特殊許可權集的虛擬記憶體段實現,對虛擬記憶體段的讀寫會使作業系統讀寫磁碟檔案中的對應部分。include void mmap void addr,si...
理解java中的mmap
提高io效率,很多文件中提到這一點,具體大家可以自行測試。mapmode.read only 唯讀對映 mapmode.read write 讀寫對映 mapmode.private copy on write對映,一旦需要改變原有buffer,拷貝乙份原來的 public class mmapte...