http://hi.baidu.com/yoursguang/blog/item/81f77f387720022296ddd814.html
mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間後,進程可以像訪問普通內存一樣對文件進行訪問,不必再 調用read(),write()等操作。mmap並不分配空間, 只是將文件映射到調用進程的地址空間裏, 然後你就可以用memcpy等操作寫文件, 而不用write()了.寫完後用msync()同步一下, 你所寫的內容就保存到文件裏了. 不過這種方式沒辦法增加文件的長度, 因爲要映射的長度在調用mmap()的時候就決定了.
簡單說就是把一個文件的內容在內存裏面做一個映像,內存比磁盤快些。
基本上它是把一個檔案對應到你的virtual memory 中的一段,並傳回一個指針。
以後對這段 memory 做存取時,其實就是對那個檔做存取。
它就是一種快速 file I/O 的東東,而且使用上和存取 memory 一樣方便,只不過會佔掉你的 virutal memory。
#include <sys/types.h>
#include <sys/stat.h> //文件狀態結構
#include <unistd.h>
#include <sys/mman.h> //mmap頭文件
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
mmap開啓記憶體對映。
start指定記憶體位置,通常都是用NULL。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 : 讓核心自行決定是否寫入,僅在特殊狀況下使用
例子:
if( (fp = open("./data.bin",O_RDONLY) ) < 0 )
{
cout<<" Can not open !"<<endl;
exit(0);
}
if( (fstat(fp,&stat_data) ) < 0 )
{
cout<<" fstat error !";
exit(0);
}
if( ( start_fp = mmap(NULL,stat_data.st_size,
PROT_READ,MAP_SHARED,fd_denseindex,0 )) == (void *)-1)
{
cout<<" mmap error !"<<endl;
exit(0);
}
這樣便能從start_fp開始讀取數據啦!