mmap例子詳解

2021-04-14 00:45:09 字數 2256 閱讀 8634

mmap函式是unix/linux下的系統呼叫,來看《unix netword programming》卷二12.2節有詳細介紹。

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

mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。mmap並不分配空間, 只是將檔案對映到呼叫程序的位址空間裡, 然後你就可以用memcpy等操作寫檔案, 而不用write()了.寫完後用msync()同步一下, 你所寫的內容就儲存到檔案裡了. 不過這種方式沒辦法增加檔案的長度, 因為要對映的長度在呼叫mmap()的時候就決定了.

簡單說就是把乙個檔案的內容在記憶體裡面做乙個映像,記憶體比磁碟快些。

基本上它是把乙個檔案對應到你的virtual memory 中的一段,並傳回乙個指標。

以後對這段 memory 做訪問時,其實就是對那個檔做訪問。

它就是一種快速 file i/o 的東東,而且使用上和訪問 memory 一樣方便,只不過會佔掉你的 virutal memory。

#include

#include //檔案狀態結構

#include

#include //mmap標頭檔案

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

mmap開啟記憶體對映。

引數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,表示從檔案頭開始對映。

int munmap(void *start, size_t length);

int msync(const void *start, size_t length, int flags);

如果開啟記憶體對映是希望寫入檔案中,那麼修改過的記憶體會在一段時間內與檔案稍稍有點不同。如果您希望立即將資料寫入檔案中,可使用msync。

start為記憶體開始位置,length為長度。

flags則有三個:

ms_async : 請kernel快將資料寫入。

ms_sync : 在msync結束返回前,將資料寫入。

ms_invalidate : 讓核心自行決定是否寫入,僅在特殊狀況下使用

例子:#include

#include

#include

#include

#include

#include

int main()

struct stat file_stat;

if ( fstat( fd, &file_stat) < 0 )

void *start_fp;

if( ( start_fp = mmap(null, file_stat.st_size, prot_read|prot_write, map_shared, fd, 0 )) == map_failed)

snprintf( (char *)start_fp, 4, "test");

msync( start_fp, file_stat.st_size, ms_async);

if ( munmap( start_fp, file_stat.st_size ) < 0 )

}

mmap函式詳解

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

mmap函式詳解

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

jquery ajax POST 例子詳解

function test 返回資料的格式 datatype html xml html script json jsonp text 在請求之前呼叫的函式 beforesend function 成功返回之後呼叫的函式 success function data 呼叫執行後呼叫的函式 comple...