[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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!