Windows上C++使用共享内存进行进程间通讯
共享內存 (也叫內存映射文件) 主要是通過映射機制實現的 , Windows 下進程的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊內存區域可能被多個進程同時使用 , 當調用 CreateFileMapping 創建命名的內存映射文件對象時 , Windows 即在物理內存申請一塊指定大小的內存區域 , 返回文件映射對象的句柄 hMap ; 為了能夠訪問這塊內存區域必須調用 MapViewOfFile 函數 , 促使 Windows 將此內存空間映射到進程的地址空間中 ; 當在其他進程訪問這塊內存區域時 , 則必須使用 OpenFileMapping 函數取得對象句柄 hMap , 并調用 MapViewOfFile 函數得到此內存空間的一個映射 , 這樣系統就把同一塊內存區域映射到了不同進程的地址空間中 , 從而達到共享內存的目的 , 代碼如下 :
進程 A 將數據寫入到共享內存 :
#include "stdafx.h"
#include <windows.h>
using namespace std;
#define BUF_SIZE 4096
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" ? // 共享內存名稱
? ? ? ? );
? ? // 映射緩存區視圖 , 得到指向共享內存的指針
? ? LPVOID lpBase = MapViewOfFile(
? ? ? ? hMapFile, ? ? ? ? ? ?// 共享內存的句柄
? ? ? ? FILE_MAP_ALL_ACCESS, // 可讀寫許可
? ? ? ? 0,
? ? ? ? 0,
? ? ? ? BUF_SIZE
? ? ? ? );
? ? // 將數據拷貝到共享內存
? ? strcpy((char*)lpBase,szBuffer);
? ? // 線程掛起等其他線程讀取數據
? ? Sleep(20000);
? ? // 解除文件映射
? ? UnmapViewOfFile(lpBase);
? ? // 關閉內存映射文件對象句柄
? ? CloseHandle(hMapFile);
? ? return 0;
}
進程 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;
}
---------------------?
原文:https://blog.csdn.net/tojohnonly/article/details/70246965?
?
總結
以上是生活随笔為你收集整理的Windows上C++使用共享内存进行进程间通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员成长的10个阶段
- 下一篇: VC/MFC 进程间通信方法总结