標籤:程式碼 create 訪問 logs sys else plain main stream
原文:http://blog.csdn.net/ljianhui/article/details/10253345
共用記憶體主要是通過映射機制實現的。
Windows 下進程的地址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重疊是指同一塊記憶體地區可能被多個進程同時使用。當調用 CreateFileMapping 建立命名的記憶體對應檔對象時,Windows 即在實體記憶體申請一塊指定大小的記憶體地區,返迴文件映射對象的控制代碼 hMap。為了能夠訪問這塊記憶體地區必須調用 MapViewOfFile 函數,促使 Windows 將此記憶體空間映射到進程的地址空間中。當在其他進程訪問這塊記憶體地區時,則必須使用OpenFileMapping 函數取得物件控點 hMap,並調用 MapViewOfFile 函數得到此記憶體空間的一個映射。這樣一來,系統就把同一塊記憶體區域對應到了不同進程的地址空間中,從而達到共用記憶體的目的。
下面舉例說明如何將記憶體對應檔用於共用記憶體。
第一次運行這個例子時,它建立了共用記憶體,並寫入資料“This is common data!” 。只要建立共用記憶體的進程沒有關閉控制代碼hMap,以後啟動並執行程式就會讀出共用記憶體裡面的資料,並列印出來。這就是使用共用記憶體在處理序間通訊的過程。程式碼如下。
[csharp] view plain copy
- #include <windows.h>
- #include <iostream>
- #include <string>
- #include <cstring>
- using namespace std;
-
- int main()
- {
- string strMapName("ShareMemory"); // 記憶體映射對象名稱
- string strComData("This is common data!"); // 共用記憶體中的資料
- LPVOID pBuffer; // 共用記憶體指標
-
- // 首先試圖開啟一個命名的記憶體對應檔對象
- HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, strMapName.c_str());
- if (NULL == hMap)
- { // 開啟失敗,建立之
- hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,
- NULL,
- PAGE_READWRITE,
- 0,
- strComData.length()+1,
- strMapName.c_str());
- // 映射對象的一個視圖,得到指向共用記憶體的指標,設定裡面的資料
- pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- strcpy((char*)pBuffer, strComData.c_str());
- cout << "寫入共用記憶體資料:" << (char *)pBuffer << endl;
- }
- else
- { // 開啟成功,映射對象的一個視圖,得到指向共用記憶體的指標,顯示出裡面的資料
- pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- cout << "讀取共用記憶體資料:" << (char *)pBuffer << endl;
- }
-
- getchar(); // 注意,進程關閉後,所有控制代碼自動關閉,所以要在這裡暫停
-
- // 解除檔案對應,關閉記憶體對應檔物件控點
- ::UnmapViewOfFile(pBuffer);
- ::CloseHandle(hMap);
- system("pause");
- return 0;
- }
連續兩次運行這個程式,它們的輸出結果如下所示:
-
頂
-
0
-
踩
Windows共用記憶體樣本