【IPC程式間通訊之三】記憶體對映檔案Mapping File
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 //共享記憶體名稱
);
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 //對映位元組數
);
HANDLE hFileMappingObject, //Mapping物件
DWORD dwDesiredAccess, //存取類別
DWORD dwFileOffsetHigh, //對映檔案高位
DWORD dwFileOffsetLow, //對映檔案地位
SIZE_T dwNumberOfBytesToMap //對映位元組數
);
該函式用於建立Mapping物件的對映記憶體,返回對映記憶體。
記憶體複製:
VOID CopyMemory(
PVOID Destination, //要複製記憶體塊的目的地址
CONST VOID *Source, //要複製記憶體塊的源地址
SIZE_T Length //複製的位元組數
);
PVOID Destination, //要複製記憶體塊的目的地址
CONST VOID *Source, //要複製記憶體塊的源地址
SIZE_T Length //複製的位元組數
);
該函式用於將資料複製到對映記憶體。
開啟Mapping物件:
HANDLE OpenFileMapping(
DWORD dwDesiredAccess , // 存取許可權
BOOL bInheritHandle , //繼承設定,一般設為FALSE
LPCTSTR lpName // Mapping物件名
);
DWORD dwDesiredAccess , // 存取許可權
BOOL bInheritHandle , //繼承設定,一般設為FALSE
LPCTSTR lpName // Mapping物件名
);
該函式用於開啟一個存在的Mapping物件。返回Mapping物件控制程式碼。
3.牛刀小試:
先在VC6.0中執行process1程式,在執行process2程式:
執行效果:
process1程式:
#include
#include
#include
void main()
{
char szName[]="共享記憶體示例!";
char szMsg[]="Hello Mapping!";
//檔案對映控制程式碼
HANDLE hMapFile;
//共享資料緩衝區指標
LPTSTR pBuf;
//建立命名的檔案對映,不代表任務硬碟上的檔案
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
256,
szName);
//建立對映記憶體
pBuf = (LPTSTR) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
256);
//將共享資料複製到檔案對映中
CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));
printf("共享記憶體建立完成,按任意鍵取消共享內 存並退出!\n");
getch();
//取消對映,退出
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
process2 程式:
#include
#include
#include
/* 預處理申明*/
#pragma comment (lib, "User32.lib")
#define BUF_SIZE 256
/* 全域性變數 */
TCHAR szName[]=TEXT("共享記憶體示例!");
void main()
{
HANDLE hMapFile;
LPTSTR pBuf;
//開啟檔案mapping
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
szName);
if (hMapFile == NULL)
{
printf("OpenFileMapping error: %d.\n", GetLastError());
return;
}
//對映
pBuf = MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
256);
if (pBuf == NULL)
{
printf("MapViewOfFile error %d\n", GetLastError());
return;
}
//訊息得到的共享資料
printf("共享記憶體資料: %s\n",pBuf);
//取消mapping,關閉控制程式碼,返回
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
相關文章
- 溫故之.NET程式間通訊——記憶體對映檔案記憶體
- C# .Net 多程式同步 通訊 共享記憶體 記憶體對映檔案 Memory MappedC#記憶體APP
- 使用記憶體對映檔案(mmap)記憶體
- windows核心程式設計--記憶體對映檔案Windows程式設計記憶體
- 程式間通訊 --IPC
- 程式間通訊---共享記憶體記憶體
- 程式間的八種通訊方式----共享記憶體是最快的 IPC 方式記憶體
- system-v IPC共享記憶體通訊記憶體
- IPC-程式間通訊
- 程式間通訊之共享記憶體記憶體
- VC++中用記憶體對映檔案 (轉)C++記憶體
- 二進位制檔案記憶體對映記憶體
- 記憶體對映檔案詳解-----C++實現(即一塊記憶體和一個檔案相對映對應)記憶體C++
- 程式間通訊(IPC) 的限制
- Python mmap的使用-檔案記憶體對映Python記憶體
- 居然這就是C++記憶體對映檔案?!C++記憶體
- 記憶體對映記憶體
- 非同步日誌 vs. 記憶體對映檔案非同步記憶體
- Linux程式間通訊之共享記憶體Linux記憶體
- Linux程式間通訊——使用共享記憶體Linux記憶體
- 微服務的程式間通訊(IPC)微服務
- mmap記憶體對映記憶體
- 一個記憶體檔案對映使用者類 (轉)記憶體
- linux程式間的通訊(C): 共享記憶體Linux記憶體
- 程式-IPC 共享記憶體和訊息佇列 (三)記憶體佇列
- Linux 記憶體管理:記憶體對映Linux記憶體
- linux程式間通訊(IPC)小結Linux
- 【IPC程式間通訊之二】管道PipeC程式
- 程序間通訊(3)-共享記憶體記憶體
- Java記憶體對映,上G大檔案輕鬆處理Java記憶體
- Java使用記憶體對映實現大檔案的上傳Java記憶體
- Linux 程式間通訊之System V 共享記憶體Linux記憶體
- 【IPC程式間通訊之一】郵槽MailSlotC程式AI
- 程式間通訊——XSI IPC之訊息佇列佇列
- JAVA記憶體對映檔案實現多執行緒下載Java記憶體執行緒
- C#記憶體對映大檔案並使用Marshal解析結構體資訊C#記憶體結構體
- (原創)[.Net] 程式間通訊框架(基於共享記憶體)——SimpleMMF框架記憶體
- Java 中使用記憶體對映檔案需要考慮的 10 個問題Java記憶體