Windows系统——进程通信共享内存区

Windows系统——进程通信共享内存区

实现代码

  • writer.cpp
/*
author : eclipse
email  : eclipsecs@qq.com
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  : eclipsecs@qq.com
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);
  • 参数
  1. 欲创建映射文件句柄
  2. 指定安全对象
  3. 读写权限
  4. 文件映射最大长度高32位
  5. 文件映射最大长度低32位
  6. 指定文件映射对象名

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
    );
  • 参数
  1. 文件映射对象句柄
  2. 映射对象文件的访问权限
  3. 文件映射起始偏移高32位
  4. 文件映射起始偏移低32位
  5. 映射文件字节数

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值