【发布时间】:2019-07-19 06:17:35
【问题描述】:
我在 windows 上使用 c++ 并制作了一个简单的方法来在两个进程之间进行通信
第一个进程创建映射内存,在其中写入第一条消息并为另一个进程复制句柄(映射内存未命名) 代码是这样的:
hMapped = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 1000, "my_shared_memory");
if (!hMapped)
{
cout << "[!] failed to create the shared mapped memory with error : " << GetLastError() << endl;
getchar();
}
char *shared_buffer = (char*)MapViewOfFile(hMapped, FILE_MAP_ALL_ACCESS, 0, 0, mapped_memory_size);
然后其他进程获取句柄,打开视图并检索写入的第一个缓冲区
然后它会循环并每 6 秒检查一次新的写入操作并进行处理
我从第一个过程写成这样:
std::lock_guard<std::mutex> lock(mtx);
RtlSecureZeroMemory(shared_buffer, mapped_memory_size);
shared_buffer[0] = 'n'; // it's a hint for the other process
memcpy(shared_buffer + 1, this->stuff.get_data().c_str(), this->stuff.get_data().size() + 1);
但是缓冲区没有为第二个进程更新它是第一个缓冲区
这是第二个过程中的代码:
HANDLE shared_memory = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, "my_shared_memory");
char *shared_buffer = (char*)MapViewOfFile(shared_memory, FILE_MAP_ALL_ACCESS, 0, 0, 1000);
utils::command_line_parser cmd_parser;
cmd_parser.parse(std::string((char*)shared_buffer + 1));
if (!cmd_parser.valid()) { // I get that they are valid and I verify that
printf("failed to parse the arguments !");
return TRUE;
}
while(true)
{
Sleep(6000);
// CloseHandle(shared_memory);
// shared_memory = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, "my_shared_memory");
// shared_buffer = (char*)MapViewOfFile(shared_memory, FILE_MAP_ALL_ACCESS, 0, 0, 1000);
MessageBoxA(0, (char*)shared_buffer, "message", 0);
char res = shared_buffer[0];
switch (res)
{
case 'q' :
// do some stuff
case 'n' :
// do some stuff
break;
default:
break;
}
【问题讨论】:
-
评论归档moved to chat。
标签: c++ winapi ipc memory-mapped-files