windows下进程间通讯主要有,管道,匿名管道,共享内存,套接字,其中共享内存的通讯效率最高。
本篇文章主要是用来学习使用“共享内存”和信号量来进行进程间通讯和进程间同步。
例子:
主进程负责写数据
#include<iostream>
#include<Windows.h>
#include<string>
#define SHAREMEMORYNAME L"QCSHAREMEMORY"
#define SHARESEMAPHORENAME L"QCSEMAPHORE"
typedef struct _ShareObject
{
char szReMark[128];
bool exitLoop;
}ShareObject, *pShareObject;
using namespace std;
int main()
{
cout << "主进程负责写数据" << endl;
//创建内存映射文件,通讯字节为sizeof(ShareObject)
HANDLE hMapping = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, sizeof(ShareObject), SHAREMEMORYNAME);
if (!hMapping)
{
cout << "cannot create mapping" << endl;
cout << GetLastError() << endl;
return 0;
}
//创建信号量做进程用
HANDLE hSemaphor = ::CreateSemaphore(NULL, 0, 1, SHARESEMAPHORENAME);
//将内存映射文件加载到当前进程中
ShareObject* pShare = (pShareObject)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);
if (!hSemaphor) return -1;
if (pShare)
{
string szContent = "";
while (cin >> szContent)
{
char szText[128];
strcpy_s(szText, sizeof(szText), szContent.c_str());
memcpy_s(pShare->szReMark, sizeof(pShare->szReMark), szText, sizeof(szText));
pShare->exitLoop = false;
if (szContent == "exit")
{
pShare->exitLoop = true;
::ReleaseSemaphore(hSemaphor, 1, NULL);
break;
}
::ReleaseSemaphore(hSemaphor, 1, NULL);
}
//从当前进程卸载内存映射文件
::UnmapViewOfFile(pShare);
}
::CloseHandle(hMapping);
::CloseHandle(hSemaphor);
}
子进程负责读数据
#include <iostream>
#include<Windows.h>
#include<string>
#define SHAREMEMORYNAME L"QCSHAREMEMORY"
#define SHARESEMAPHORENAME L"QCSEMAPHORE"
typedef struct _ShareObject
{
char szReMark[128];
bool exitLoop;
}ShareObject, * pShareObject;
using namespace std;
int main()
{
cout << "子进程负责读数据" << endl;
HANDLE hMapping = ::OpenFileMapping(FILE_MAP_READ, FALSE, SHAREMEMORYNAME); //打开内存映射文件
HANDLE hSemaphore = ::OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, SHARESEMAPHORENAME);
//打开信号量
if (!hSemaphore) return -1;
if (hMapping)
{
//将内存映射文件加载到当前进程当中,并指定只读属性,大小为约定的sizeof(ShareObject)字节
//返回的是指向内存映射的指针
ShareObject* pData = (pShareObject)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, sizeof(ShareObject));
if (pData)
{
while (!pData->exitLoop)
{
//等待主进程将数据接入内存文件
WaitForSingleObject(hSemaphore, INFINITE);
cout << pData->szReMark << endl;
}
}
::CloseHandle(hMapping);
::CloseHandle(hSemaphore);
}
}