一、进程与进程通信
进程间通信(Interprocess Communication, IPC)是指不同的进程之间进行数据共享和数据交换。
二、进程间通信方式
1. 文件映射
注:文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
使用内存映射文件的一般流程:(reference from: https://blog.csdn.net/qq_20183489/article/details/54646794)
另外,内存映射文件在处理大数据量的文件时表现出了良好的性能(实际上,文件越大,内存映射的优势就越明显)。示例可以参考:https://blog.csdn.net/zzq060143/article/details/54619571
2.2 共享内存
Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF(INVALID_HANDLE_VALUE)来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
共享内存实现数据共享示例如下:
1 //发送数据的进程先启动,用于发送数据,即将数据写入视图 。 2 3 #include "stdafx.h" 4 #include <Windows.h> 5 #include <conio.h> 6 7 #define BUFFER_SIZE 256 8 TCHAR szMapFileName[] = TEXT("MyFileMappingName"); //映射文件名,即共享内存的名称 9 TCHAR szSendData[] = TEXT("Message from the send process."); 10 11 int main() 12 { 13 HANDLE hMapFile = NULL; 14 LPCTSTR pBuf = NULL; 15 16 //1. 创建一个文件映射内核对象 17 hMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUFFER_SIZE, szMapFileName); //INVALID_HANDLE_VALUE表示创建一个进程间共享的对象 18 if (NULL == hMapFile) 19 { 20 _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError()); 21 return -1; 22 } 23 24 //2. 将文件数据映射到进程的地址空间 25 pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE); 26 if (NULL == pBuf) 27 { 28 _tprintf(TEXT("Could not map view of file (%d). \n"), GetLastError()); 29 30 CloseHandle(hMapFile); 31 hMapFile = NULL; 32 33 return -1; 34 } 35 36 //3. 写入到内存中 37 CopyMemory((void*)pBuf, szSendData, _tcslen(szSendData) * sizeof(TCHAR)); 38 _getch(); //这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车 39 40 //4. 从进程的地址空间中撤消文件数据的映像 41 UnmapViewOfFile(pBuf); 42 43 //5. 关闭文件映射对象和文件对象 44 CloseHandle(hMapFile); 45 46 getchar(); 47 return 0; 48 }