[Windows进程间通信] 文件映射 / 共享内存

参考链接:https://blog.csdn.net/Timeinsist/article/details/77952278

进程间通过文件映射 / 共享内存的方式进行通信,主要使用以下几个API

复制代码
HANDLE CreateFileMapping(
  [in]           HANDLE                hFile,
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  [in]           DWORD                 flProtect,
  [in]           DWORD                 dwMaximumSizeHigh,
  [in]           DWORD                 dwMaximumSizeLow,
  [in, optional] LPCSTR                lpName
);

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwFileOffsetHigh,
  [in] DWORD  dwFileOffsetLow,
  [in] SIZE_T dwNumberOfBytesToMap
);

HANDLE OpenFileMapping(
  [in] DWORD  dwDesiredAccess,
  [in] BOOL   bInheritHandle,
  [in] LPCSTR lpName
);

BOOL UnmapViewOfFile(
  [in] LPCVOID lpBaseAddress
);
复制代码

进程A使用CreateFileMapping创建一个映射文件,然后使用MapViewOfFile得到一块该文件上可供读/写的内存

进程B使用OpenFileMapping打开一个已有的映射文件,并使用MapViewOfFile得到一块该文件上可供读/写的内存

使用完毕时,用UnmapViewOfFile关闭该映射文件。

使用该方法进行进程间通信的缺点如下:

1. 需要考虑进程间同步问题,如数据加锁等

2. 无法跨机器/设备/网络调用

 

示例如下:

进程A

复制代码
#include <Windows.h>
#include <iostream>
using namespace std;

#define BUFFER_SIZE 4096

int main() {
    auto hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE, 
        NULL, 
        PAGE_READWRITE, 
        0, 
        BUFFER_SIZE, 
        "my_file_mapping"
    );
    if (!hMapFile) {
        return -1;
    }

    auto hEvent = CreateEvent(
        NULL,
        false,
        false, 
        "my_event"
    );
    if (!hEvent) {
        CloseHandle(hMapFile);
        return -1;
    }

    auto lpBuf = MapViewOfFile(
        hMapFile, 
        FILE_MAP_ALL_ACCESS, 
        0, 
        0, 
        BUFFER_SIZE
    );
    if (!lpBuf) {
        CloseHandle(hMapFile);
        CloseHandle(hEvent);
        return -1;
    }

    char szBuf[4096] = { 0 };
    while (true) {
        cout << "> ";
        cin >> szBuf;

        if (!strcmp(szBuf, "quit")) {
            break;
        }

        strcpy_s((char*)lpBuf, BUFFER_SIZE, szBuf);
        SetEvent(hEvent);
        Sleep(50);
    }

    UnmapViewOfFile(lpBuf);
    CloseHandle(hEvent);
    CloseHandle(hMapFile);

    return 0;
}
复制代码

进程B

复制代码
#include <Windows.h>
#include <iostream>
using namespace std;

#define BUFFER_SIZE 4096

int main() {
    auto hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,
        FALSE, 
        "my_file_mapping"
    );
    if (!hMapFile) {
        return -1;
    }

    auto hEvent = OpenEvent(
        EVENT_ALL_ACCESS, 
        true, 
        "my_event"
    );
    if (!hEvent) {
        CloseHandle(hMapFile);
        return -1;
    }

    auto pBuf = MapViewOfFile(
        hMapFile, 
        FILE_MAP_ALL_ACCESS, 
        0, 
        0, 
        BUFFER_SIZE
    );
    if (!pBuf) {
        CloseHandle(hMapFile);
        CloseHandle(hEvent);
        return -1;
    }

    char sz[BUFFER_SIZE] = { 0 };
    while (true) {
        WaitForSingleObject(hEvent, INFINITE);
        strcpy_s(sz, BUFFER_SIZE, (char*)pBuf);
        cout << sz << endl;
    }

    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    CloseHandle(hEvent);

    return 0;
}
复制代码

 

posted @   czhao4  阅读(254)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示