mmap函式詳解

2021-06-03 08:33:13 字數 1265 閱讀 5457

mmap可以把磁碟檔案的一部分直接對映到記憶體,這樣檔案中的位置直接就有對應的記憶體位址,對檔案的讀寫可以直接用指標來做而不需要read/write函式。

原型:#include

void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);

int munmap(void *addr, size_t len);

引數解釋如下:整體相當於磁碟檔案的對應長度搬移到記憶體中。如果addr引數為null,核心會自己在程序位址空間中選擇合適的位址建立對映。如果addr不是null,則給核心乙個提示,應該從什麼位址開始對映,核心會選擇addr之上的某個合適的位址開始對映。建立對映後,真正的對映首位址通過返回值可以得到。len引數是需要對映的那一部分檔案的長度。off引數是從檔案的什麼位置開始對映,必須是頁大小的整數倍(在32位體系統結構上通常是4k)。filedes是代表該開啟檔案的描述符。

prot引數有四種取值:

prot_exec表示對映的這一段可執行,例如對映共享庫

prot_read表示對映的這一段可讀

prot_write表示對映的這一段可寫

prot_none表示對映的這一段不可訪問

flag引數有很多種取值,這裡只講兩種,

map_shared多個程序對同乙個檔案的對映是共享的,乙個程序對對映的記憶體做了修改,另乙個程序也會看到這種變化。

map_private多個程序對同乙個檔案的對映不是共享的,乙個程序對對映的記憶體做了修改,另乙個程序並不會看到這種變化,也不會真的寫到檔案中去。

如果mmap成功則返回對映首位址,如果出錯則返回常數map_failed。當程序終止時,該程序的對映記憶體會自動解除,也可以呼叫munmap解除對映。munmap成功返回0,出錯返回-1。模型如下:

實驗如下:可以手工建立乙個hello.txt檔案檔案,編輯其內容。

#include

#include

#include

int main(void)

p = mmap(null, 6, prot_write, map_shared, fd, 0);

if (p == map_failed)

close(fd);   //關掉fd不影響對映的記憶體,除非munmap掉。

p[0] = 0x30313233; //改寫其內容

munmap(p, 6);

return 0;

}gcc編譯,執行a.out,在cat hello.txt,可以看到其內容已發生改變。

mmap函式詳解

mmap可以把磁碟檔案的一部分直接對映到記憶體,這樣檔案中的位置直接就有對應的記憶體位址,對檔案的讀寫可以直接用指標來做而不需要read write函式。原型 include void mmap void addr,size t len,int prot,int flag,int filedes,o...

mmap例子詳解

mmap函式是unix linux下的系統呼叫,來看 unix netword programming 卷二12.2節有詳細介紹。mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而posix或系統v的共享記憶...

mmap函式使用

unix網路程式設計第二卷程序間通訊對mmap函式進行了說明。該函式主要用途有三個 1 將乙個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代i o讀寫,以獲得較高的效能 2 將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間 3 為無關聯的程序提供共享記...