最近在做一個項目要在多個程序間傳遞數據,在網上調研了一番準備采用這種最簡單的方式,總結記錄一下。
在兩個獨立的進程之間如果想要互相通信,我們可以借助一個公共的媒介,例如開辟一個文件作為介質,一個進程往里寫數據,另一個進程從中讀數據,這樣就實現了進程間數據通信,這種方法被稱為“共享外存/共享文件”。本文介紹的的共享內存與其類似,只不過這個公共的介質變成了系統預留(reserve)的進程內的地址空間,有的地方又把這種“共享內存”的方式叫做“內存映射文件”方式。
主要使用的API函數有:
CreateFileMapping
MapViewOfFile
UnmapViewOfFile
CloseHandle
存儲程序,這段代碼通過命令行輸入一個int數字,然后存儲到共享的內存位置:
#include <iostream>
#include <Windows.h>
#include <tchar.h>
static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024;
using namespace std;
int main()
{
int a;
__shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
__shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);
while(1)
{
cin>>a;
*((int*)__shmbuf) = a;
}
UnmapViewOfFile(__shmbuf);
CloseHandle(__shmem);
__shmem = INVALID_HANDLE_VALUE;
__shmbuf = NULL;
}
讀取程序,這段代碼一直讀取該段地址的數據,發現變化后打印出來:
#include <iostream>
#include <Windows.h>
#include <tchar.h>
static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024; // 共享內存的大小
using namespace std;
int main()
{
int LastData = 0;
__shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
__shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);
while(1)
{
if(LastData != *((int *)__shmbuf))
{
LastData = *((int *)__shmbuf);
printf("%d\n",LastData);
}
Sleep(100);
}
}
這里就簡單測試一下,unmap和close函數就瞎搞了,實際使用的時候需要加上。(PS:如果使用Qt報錯了,在pro里加上DEFINES-= UNICODE)
如圖,右邊的窗口是在一直從命令行讀取數據然后存儲,左邊窗口顯示數據的變化。
1.PNG
在實際使用中,可以使用結構體等數據類型,方便數據的操作。