进程通信实验:在windows操作系统环境下,用VS开发工具,用c++语言模拟实现两个进程之间进行数据共享,并使用共享内存作为通信机制。每个进程可以读取、修改和写入共享的数据结构,确保数据一致性和正确性,要一个完整的、普通水平的代码
时间: 2024-02-10 15:10:47 浏览: 71
进程通信实验
好的,以下是一个完整的、普通水平的代码实现:
进程1的代码:
```c++
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
// 共享内存结构体
struct SharedData
{
int number; // 共享数据
bool isReady; // 是否准备好
char message[256]; // 共享消息
};
int main()
{
// 创建共享内存
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用系统分页文件
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 共享内存大小(高位)
sizeof(SharedData), // 共享内存大小(低位)
TEXT("SharedMemory")); // 共享内存名称
// 映射共享内存
SharedData* pData = (SharedData*)MapViewOfFile(
hMapFile, // 共享内存句柄
FILE_MAP_ALL_ACCESS, // 可读可写
0, // 共享内存起始地址(高位)
0, // 共享内存起始地址(低位)
sizeof(SharedData)); // 共享内存大小
// 修改共享数据
pData->number = 100;
// 写入共享消息
string message = "Hello World!";
strcpy_s(pData->message, message.c_str());
// 设置共享数据已准备好
pData->isReady = true;
// 等待进程2读取共享数据
cout << "等待进程2读取共享数据...\n";
while (pData->isReady)
{
Sleep(1000); // 等待1秒
}
// 释放共享内存
UnmapViewOfFile(pData); // 解除映射
CloseHandle(hMapFile); // 关闭句柄
return 0;
}
```
进程2的代码:
```c++
#include <windows.h>
#include <iostream>
using namespace std;
// 共享内存结构体
struct SharedData
{
int number; // 共享数据
bool isReady; // 是否准备好
char message[256]; // 共享消息
};
int main()
{
// 打开共享内存
HANDLE hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 可读可写
FALSE, // 不继承
TEXT("SharedMemory")); // 共享内存名称
// 映射共享内存
SharedData* pData = (SharedData*)MapViewOfFile(
hMapFile, // 共享内存句柄
FILE_MAP_ALL_ACCESS, // 可读可写
0, // 共享内存起始地址(高位)
0, // 共享内存起始地址(低位)
sizeof(SharedData)); // 共享内存大小
// 读取共享数据
int number = pData->number;
cout << "共享数据:" << number << endl;
// 读取共享消息
char message[256];
strcpy_s(message, pData->message);
cout << "共享消息:" << message << endl;
// 修改共享数据
pData->number = 200;
// 设置共享数据未准备好
pData->isReady = false;
// 释放共享内存
UnmapViewOfFile(pData); // 解除映射
CloseHandle(hMapFile); // 关闭句柄
return 0;
}
```
在这个例子中,进程1先修改共享数据,并写入共享消息,然后设置共享数据已准备好。进程2读取共享数据和共享消息后,修改共享数据,并设置共享数据未准备好。最后,两个进程都释放共享内存。
注意,这里我们使用了一个isReady标志来确保数据的一致性和正确性。在实际应用中,我们可能需要更复杂的同步机制来保证多个进程之间的数据同步。
阅读全文