进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法。 那么, 在本文中, 我们即将学习“共享内存”的方式实现进程间的通信, 这是IPC最快的方法。有的地方又把这种“共享内存”的方式叫做“内存映射文件”方式。
我们首先来看看进程A对应的程序:
- #include <iostream>
- #include <windows.h>
- using namespace std;
- #define BUF_SIZE 1025
- char szName[] = "NameOfMappingObject"; // 共享内存的名字
- int main()
- {
- // 创建共享文件句柄
- HANDLE hMapFile = CreateFileMapping(
- INVALID_HANDLE_VALUE, // 物理文件句柄
- NULL, // 默认安全级别
- PAGE_READWRITE, // 可读可写
- 0, // 高位文件大小
- BUF_SIZE, // 地位文件大小
- szName // 共享内存名称
- );
- char *pBuf = (char *)MapViewOfFile(
- hMapFile, // 共享内存的句柄
- FILE_MAP_ALL_ACCESS, // 可读写许可
- 0,
- 0,
- BUF_SIZE
- );
- while(1)
- {
- cout << "input..." << endl;
- char szInfo[BUF_SIZE] = {0};
- gets(szInfo); // 其实gets并不安全
- strncpy(pBuf, szInfo, BUF_SIZE - 1);
- pBuf[BUF_SIZE - 1] = '\0';
- }
- UnmapViewOfFile(pBuf);
- CloseHandle(hMapFile);
- return 0;
- }
然后, 我们再来看看进程B对应的程序:
- #include <iostream>
- #include <windows.h>
- using namespace std;
- #define BUF_SIZE 1025
- char szName[] = "NameOfMappingObject"; // 共享内存的名字
- int main()
- {
- // 创建共享文件句柄
- HANDLE hMapFile = CreateFileMapping(
- INVALID_HANDLE_VALUE, // 物理文件句柄
- NULL, // 默认安全级别
- PAGE_READWRITE, // 可读可写
- 0, // 高位文件大小
- BUF_SIZE, // 地位文件大小
- szName // 共享内存名称
- );
- char *pBuf = (char *)MapViewOfFile(
- hMapFile, // 共享内存的句柄
- FILE_MAP_ALL_ACCESS, // 可读写许可
- 0,
- 0,
- BUF_SIZE
- );
- while(1)
- {
- cout << "press any button to receive data..." << endl;
- getchar();
- cout << pBuf << endl;
- }
- UnmapViewOfFile(pBuf);
- CloseHandle(hMapFile);
- return 0;