IPC處理序間通訊+共用記憶體Mapping IPC(Inter-Process Communication,處理序間通訊)。 檔案對應(Mapping)是一種將檔案內容映射到記憶體位址的技術,通過對映射記憶體,讀寫檔案如同讀寫記憶體一般簡單。 多個進程映射同一個檔案對應物件,也即多個進程映射到同一個實體儲存體頁面,因此,當一個進程向映射記憶體寫入資料時,其他進程可以通過映射記憶體讀取資料,通過這個機制實現處理序間通訊。 1.記憶體檔案對應Mapping File :
A進程建立一個命名的Mapping對象,並在映射記憶體中寫入需要共用的資料。B進程通過對象名開啟Mapping對象,映射該Mapping對象,從映射記憶體中讀取資料。
2.基本API函數 :建立Mapping對象: HANDLE CreateFileMapping(
HANDLE hFile, //物理檔案控制代碼
LPSECURITY_ATTRIBUTES lpAttributes, //安全設定
DWORD flProtect, //保護設定
DWORD dwMaximumSizeHigh, //高位檔案大小
DWORD dwMaximumSizeLow, //低位檔案大小
LPCTSTR lpName //共用記憶體名稱
); 該函數返回建立的Mapping對象。建立映射記憶體: LPVOID MapViewOfFile(
HANDLE hFileMappingObject, //Mapping對象
DWORD dwDesiredAccess, //存取類別
DWORD dwFileOffsetHigh, //對應檔高位
DWORD dwFileOffsetLow, //對應檔地位
SIZE_T dwNumberOfBytesToMap //映射位元組數
);
該函數用於建立Mapping對象的映射記憶體,返回映射記憶體。記憶體複製: VOID CopyMemory(
PVOID Destination, //要複製記憶體塊的目的地址
CONST VOID *Source, //要複製記憶體塊的源地址
SIZE_T Length //複製的位元組數
); 該函數用於將資料複製到映射記憶體。開啟Mapping對象: HANDLE OpenFileMapping(
DWORD dwDesiredAccess , // 存取許可權
BOOL bInheritHandle , //繼承設定,一般設為FALSE
LPCTSTR lpName // Mapping對象名
); 該函數用於開啟一個存在的Mapping對象。返回Mapping物件控點。 3.牛刀小試: 先在VC6.0中運行process1程式,在運行process2程式:
運行效果:
process1程式:process2 程式: