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開啟記憶體對映。
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 )
if( ( start_fp = mmap(null,stat_data.st_size,
prot_read,map_shared,fd_denseindex,0 )) == (void *)-1)
{cout<<" mmap error !" pragma是預處理指令,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指 令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。其格式一般為 pragmap... 建立 uitableview datatable uitableview alloc initwithframe cgrectmake 0,0,320,420 datatable setdelegate self datatable setdatasource self self.view adds... ios開發qq群 204161656 建立 uitableview datatable uitableview alloc initwithframe cgrectmake 0,0,320,420 datatable setdelegate self datatable setdatasource ...pragma詳細解釋
TableView詳細解釋
TableView詳細解釋