轉載:https://blog.csdn.net/tojohnonly/article/details/70246965ios
共享內存 (也叫內存映射文件) 主要是經過映射機制實現的 , Windows 下進程的地址空間在邏輯上是相互隔離的 , 但在物理上倒是重疊的 ; 所謂的重疊是指同一塊內存區域可能被多個進程同時使用 , 當調用 CreateFileMapping 建立命名的內存映射文件對象時 , Windows 即在物理內存申請一塊指定大小的內存區域 , 返回文件映射對象的句柄 hMap ; 爲了可以訪問這塊內存區域必須調用 MapViewOfFile 函數 , 促使 Windows 將此內存空間映射到進程的地址空間中 ; 當在其餘進程訪問這塊內存區域時 , 則必須使用 OpenFileMapping 函數取得對象句柄 hMap , 並調用 MapViewOfFile 函數獲得此內存空間的一個映射 , 這樣系統就把同一塊內存區域映射到了不一樣進程的地址空間中 , 從而達到共享內存的目的 , 代碼以下 :windows
進程 A 將數據寫入到共享內存 :緩存
#include "stdafx.h"
#include <windows.h>
using namespace std;安全
#define BUF_SIZE 4096app
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// 定義共享數據
char szBuffer[] = "Hello Shared Memory";函數
// 建立共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默認安全級別
PAGE_READWRITE, // 可讀可寫
0, // 高位文件大小
BUF_SIZE, // 地位文件大小
L"ShareMemory" // 共享內存名稱
);spa
// 映射緩存區視圖 , 獲得指向共享內存的指針
LPVOID lpBase = MapViewOfFile(
hMapFile, // 共享內存的句柄
FILE_MAP_ALL_ACCESS, // 可讀寫許可
0,
0,
BUF_SIZE
);.net
// 將數據拷貝到共享內存
strcpy((char*)lpBase,szBuffer);線程
// 線程掛起等其餘線程讀取數據
Sleep(20000);指針
// 解除文件映射
UnmapViewOfFile(lpBase);
// 關閉內存映射文件對象句柄
CloseHandle(hMapFile);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
進程 B 獲取共享內存中的數據 :
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 4096
int main()
{
// 打開共享的文件對象
HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");
if (hMapFile)
{
LPVOID lpBase = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
// 將共享內存數據拷貝出來
char szBuffer[BUF_SIZE] = {0};
strcpy(szBuffer,(char*)lpBase);
printf("%s",szBuffer);
// 解除文件映射 UnmapViewOfFile(lpBase); // 關閉內存映射文件對象句柄 CloseHandle(hMapFile); } else { // 打開共享內存句柄失敗 printf("OpenMapping Error"); } return 0;}--------------------- 做者:Ensk 來源:CSDN 原文:https://blog.csdn.net/tojohnonly/article/details/70246965 版權聲明:本文爲博主原創文章,轉載請附上博文連接!