mmap函式的使用

2021-05-22 03:01:38 字數 1779 閱讀 5959

mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而 posix或系統v的共享記憶體ipc則純粹用於共享目的,當然mmap()實現共享記憶體也是其主要應用之一。

mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。

我們的程式中大量運用了mmap,用到的正是mmap的這種「像訪問普通記憶體一樣對檔案進行訪問」的功能。實踐證明,當要對乙個檔案頻繁的進行訪問,並且指標來回移動時,呼叫mmap比用常規的方法快很多。

來看看mmap的定義:

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

引數fd為即將對映到程序空間的檔案描述字,一般由open()返回,同時,fd可以指定為-1,此時須指定flags引數中的map_anon,表明進行的是匿名對映(不涉及具體的檔名,避免了檔案的建立及開啟,很顯然只能用於具有親緣關係的程序間通訊)。

len是對映到呼叫程序位址空間的位元組數,它從被對映檔案開頭offset個位元組開始算起。

prot引數指定共享記憶體的訪問許可權。可取如下幾個值的或:prot_read(可讀),prot_write(可寫),prot_exec(可執行),prot_none(不可訪問)。

flags由以下幾個常值指定:map_shared, map_private, map_fixed。其中,map_shared,map_private必選其一,而map_fixed則不推薦使用。

如果指定為map_shared,則對對映的記憶體所做的修改同樣影響到檔案。如果是map_private,則對對映的記憶體所做的修改僅對該程序可見,對檔案沒有影響。

offset引數一般設為0,表示從檔案頭開始對映。

引數addr指定檔案應被對映到程序空間的起始位址,一般被指定乙個空指標,此時選擇起始位址的任務留給核心來完成。函式的返回值為最後檔案對映到程序空間的位址,程序可直接操作起始位址為該值的有效位址。

看看下面這個圖(來自《unix netword programming》卷二12.2節),對mmap進一步加深印象:

這裡不再詳細介紹mmap的引數,讀者可參考mmap手冊頁或者《unix netword programming》卷二12.2節獲得進一步的資訊。

最後,舉個例子來結束本節。4.2節說過,fileinformation陣列是以二進位制的形式寫進乙個叫inforindex的檔案中。那麼,當要訪問fileinformation陣列時,**類似這樣:

struct stat st;

char buffer=」 inforindex」;

fileinformation *_fileinfoindexptr = null;

if(stat(buffer,&st)<0)

// mmap the inforindex to _fileinfoindexptr

int fd=open(buffer, o_rdonly);

if(fd<0)

_fileinfoindexptr    = (fileinformation*)mmap(null,st.st_size, prot_read,map_shared,fd,0);

if(map_failed == _fileinfoindexptr)

close(fd); 

mmap函式的使用

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

mmap函式使用

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

mmap函式使用

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