Windows系统——进程通信共享内存区
实现代码
- writer.cpp
/*
author : eclipse
email : [email protected]
time : Sun Apr 26 12:44:13 2020
*/
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
const int BUFFER_SIZE = 1024;
const char shareMemory[] = "task";
int main()
{
HANDLE mappingFileHandle;
if (!(mappingFileHandle = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUFFER_SIZE,
shareMemory))) {
printf("Create file mapping error(%d)!", GetLastError());
abort();
}
char *buffer = NULL;
if (!(buffer = (char *)MapViewOfFile(
mappingFileHandle,
FILE_MAP_ALL_ACCESS,
0,
0,
BUFFER_SIZE))) {
printf("Map file error(%d)", GetLastError());
abort();
}
while (true) {
if (buffer[0]) {
printf("Received data\n");
printf("%s\n", buffer);
if (!strcmp(buffer, "finish")) {
break;
}
buffer[0] = '\0';
}
}
UnmapViewOfFile(buffer);
CloseHandle(mappingFileHandle);
return 0;
}
- printer.cpp
/*
author : eclipse
email : [email protected]
time : Sun Apr 26 12:42:59 2020
*/
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
const int BUFFER_SIZE = 1024;
const char shareMemory[] = "task";
int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(NULL,
(LPSTR) "printer.exe",
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi)) {
printf("Create Process error(%d)!\n", GetLastError());
abort();
}
HANDLE mappingFileHandle;
if (!(mappingFileHandle = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUFFER_SIZE,
shareMemory))) {
printf("Create file mapping error(%d)!", GetLastError());
abort();
}
char *buffer = NULL;
if (!(buffer = (char*) MapViewOfFile(
mappingFileHandle,
FILE_MAP_ALL_ACCESS,
0,
0,
BUFFER_SIZE
))) {
printf("Map file error(%d)\n", GetLastError());
abort();
}
while (strcmp(buffer, "finish")) {
printf("Send data\n");
gets(buffer);
}
UnmapViewOfFile(buffer);
CloseHandle(mappingFileHandle);
return 0;
}
实现效果
Writer进程创建子进程Printer,父子进程共享内存区,Writer进程向共享区buffer写入数据,Printer进程读取并打印,直到输入数据为"finish",子进程和父进程执行完毕。
编译过程
g++ writer.cpp -o writer
g++ printer.cpp -o printer
writer.exe
CreateFileMapping()
- 返回值
成功则返回句柄,否则返回0 - 函数原型
HANDLE WINAPI CreateFileMapping(
_In_HANDLE hFile,
_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,
_In_DWORD flProtect,
_In_DWORD dwMaximumSizeHigh,
_In_DWORD dwMaximumSizeLow,
_In_opt_LPCTSTR lpName);
- 参数
- 欲创建映射文件句柄
- 指定安全对象
- 读写权限
- 文件映射最大长度高32位
- 文件映射最大长度低32位
- 指定文件映射对象名
MapViewOfFile()
- 返回值
若成功则返回映射文件的的开始地址值,否则返回NULL - 函数原型
WINBASEAPI
_Ret_maybenull_ __out_data_source(FILE)
LPVOID
WINAPI
MapViewOfFile(
_In_ HANDLE hFileMappingObject,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwFileOffsetHigh,
_In_ DWORD dwFileOffsetLow,
_In_ SIZE_T dwNumberOfBytesToMap
);
- 参数
- 文件映射对象句柄
- 映射对象文件的访问权限
- 文件映射起始偏移高32位
- 文件映射起始偏移低32位
- 映射文件字节数
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!