C++进程和Python进程通信

article/2025/9/14 9:31:09

项目研发过程中用到了进程通信,由C++应用程序创建共享内存及两个同步事件(Event1、Event2),然后阻塞等待外部进程激活事件Event1,Event1激活后,C++应用程序读取共享内存中的数据,完成数据解析后执行相应指令,并向共享内存中写入指令执行结果,同时激活事件Event2;而Python进程则负责打开共享内存和两个同步事件,向共享内存中写入数据,并激活Event1,然后阻塞等待Event2被激活,Event2激活后,读取共享内存中的数据。进程通讯关系如下图所示:

C++程序源码如下:

 

DWORD WINAPI IPC_ReadExecuteCmd(LPVOID lpParameter)
{unsigned long buff_size = IPC_BufferSize;ControlCmdPara ReceiveData;memset(&ReceiveData, 0, sizeof(ReceiveData));ControlCmdPara SendData;memset(&SendData, 0, sizeof(SendData));HANDLE file_shared_handler = CreateFile(L"shared_memory",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (file_shared_handler == INVALID_HANDLE_VALUE)cout << "create file error" << endl;HANDLE file_mapping_handler = CreateFileMapping(file_shared_handler, NULL, PAGE_READWRITE, 0, buff_size, L"shared_memory");if (file_mapping_handler == INVALID_HANDLE_VALUE)cout << "create file_mapping error" << endl;LPVOID lp_base = MapViewOfFile(file_mapping_handler, FILE_MAP_ALL_ACCESS, 0, 0, 0);if (lp_base == INVALID_HANDLE_VALUE)cout << "MapViewOfFile error" << endl;HANDLE m_hEvent = CreateEvent(NULL, FALSE, FALSE, GLOBAL_EVENT_NAME);if (m_hEvent == nullptr)cout << "create Event error";HANDLE WaitEvent = CreateEvent(NULL, FALSE, FALSE, GLOBAL_EVENT_WAIT);if (WaitEvent == nullptr)cout << "create WaitEvent error";CString IPC_Cmd, strScriptKeyWord, strParameter;LRESULT lScriptCmdResult = 0;while (true){WaitForSingleObject(m_hEvent, INFINITE);memcpy(&ReceiveData, lp_base, buff_size);/* 调用API执行指令*/IPC_Cmd = string(ReceiveData.Cmd).substr(0, 15).c_str();strScriptKeyWord = string(ReceiveData.YjksCmd).substr(0, 31).c_str();strParameter = string(ReceiveData.Para).substr(0, 975).c_str();strScriptKeyWord.TrimRight();strParameter.TrimRight();IPC_Cmd.TrimRight();string ResaultStr = "Success";strcpy(SendData.Cmd, "Result");if (!IPC_Cmd.CompareNoCase(PLAYBACK)){lScriptCmdResult = IPC_ExecuteScrCmd(strScriptKeyWord, strParameter);}if (!IPC_Cmd.Compare(RECORD)){lScriptCmdResult = IPC_ExecuteScrCmd(L"_makescript", L"");}if (lScriptCmdResult < 0) ResaultStr = "Failure";strcpy(SendData.Para, ResaultStr.c_str());memcpy(lp_base, &SendData, buff_size);if (WaitEvent != nullptr) SetEvent(WaitEvent);}FlushViewOfFile(lp_base, buff_size);UnmapViewOfFile(lp_base);CloseHandle(file_mapping_handler);CloseHandle(file_shared_handler);return 0;
}

Python程序源码如下:

from ctypes import *
import mmapdef IPC_CmdControl(IPC_Cmd,strScriptKeyWord,strParameter):print(windll.kernel32.GetLastError())buff_size = 1024EVENT_ALL_ACCESS = 0x000F0000|0x00100000|0x3shm = mmap.mmap(0, buff_size, "shared_memory")OpenEvent=windll.kernel32.OpenEventWm_hEvent = OpenEvent(2, True, "Global\\ShareMemoryEvent")WaitEvent = OpenEvent(EVENT_ALL_ACCESS, True, "Global\\WaitResaultEvent")strParameter = "\""+strParameter+"\"";if shm:shm[:] = b' ' * buff_sizeshm.seek(0)shm.write(bytes(IPC_Cmd, 'UTF-8'))shm.seek(16)shm.write(bytes(strScriptKeyWord, 'UTF-8'))shm.seek(48)shm.write(bytes(strParameter, 'UTF-8'))windll.kernel32.SetEvent(m_hEvent)windll.kernel32.WaitForSingleObject(WaitEvent,-1)shm.seek(48)return shm.read(7).rstrip()if __name__ == '__main__':IPC_CmdControl(IPC_Cmd,strScriptKeyWord,strParameter)


http://chatgpt.dhexx.cn/article/H3fTPrBN.shtml

相关文章

Linux 进程通信

Linux 进程通信 1.传统进程通信 1.1 信号 信号机制是在软件层次上对中断机制的一种模拟。 信号的捕获与处理也成为系统的“软中断”机制。 1.1.1 常用信号 每个信号都有一个编号和宏定义的名称&#xff0c;这些名字都已SIG开头。宏定义在signal.h头文件中。 1.1.2 信号的…

进程间通信

文章目录 前言1、进程间通信的目的2、管道1.1 匿名管道1.2 命名管道 3、共享内存2.1 shmget函数2.2 shmctl函数2.3 shmat函数2.4 shmdt函数 4、消息队列5、信号量 前言 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或…

【操作系统】进程通信

什么是进程通信&#xff1f;进程为什么需要通信&#xff1f; 进程通信&#xff1a;进程通信就是进程之间的信息交换。 进程通信的目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息…

【Linux】进程通信之管道通信详解

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 文章目录 一、什么是管道通信1. 管道通信是一种在进程间传递数据的方法2.看看接口&#xff1a;匿名管道和命名管道3. 管道通信的本质是什么&#xff1f; 二、管道通信的实现和深入理解1.如何…

进程通信方式总结与盘点

​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分&#xff0c;进程同步控制多个进程按一定顺序执行&#xff0c;进程通信是一种手段&#xff0c;而进程同步是目标。从某方面来讲&#xff0c;进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到…

《操作系统》实验报告——进程通信

理论知识 Linux——Linux C语言编程基础知识 Linux——进程通信 一、实验目的 (1) 熟悉并掌握管道机制&#xff0c;并实现进程间通信 (2) 熟悉并掌握共享内存机制&#xff0c;并实现进程间通信 二、实验内容 任务一&#xff1a; &#xff08;1&#xff09;阅读以上父子…

多进程通信

多进程&#xff1a; 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别是子进程的返回值是0&#xff0c;而父进程的返回值则…

进程间通信详解

目录 一.进程间通信介绍 1.进程间通信的目的 2.进程间通信的本质 3.进程间通信分类 二.什么是管道 三.匿名管道 1. 匿名管道只能用于具有亲缘关系的进程之间进行通信&#xff0c;常用于父子。 2.pipe函数 3. 匿名管道的使用 4.管道的读写…

QProcess实现进程通信

QProcess实现进程通信的方式有点类似于管道。 QProcess父进程通过write来写入标准输入stdin&#xff0c;通过ReadyRead信号来接收子进程的消息。 QProcess子进程通过QFile来读取标准输入来接收父进程信息。通过QFile绑定QSocketNotifier来接收标准输入的实时信号&#xff0c;…

进程通信原理

目录 进程通信原理 1、同主机间的消息通讯机制 1.1 管道&#xff08;pipe&#xff09;,流管道(s_pipe)和有名管道&#xff08;FIFO&#xff09; 1.2 信号&#xff08;signal&#xff09; 1.3 消息队列 1.4 共享内存 信号量 套接字&#xff08;socket) 进程间通信各种方式效率比…

Linux进程通信

笔者在学习linux的过程中对linux进程通信进行记录学习。现在在 Linux 中使用较多的进程间通信方式主要有以下几种。 &#xff08;1&#xff09;管道&#xff08;Pipe&#xff09;及有名管道&#xff08;named pipe&#xff09;&#xff1a;管道可用于具有亲缘关系进程间的通信…

【Linux】进程间通信

目录 1. 进程间通信 1.1. 进程间通信的目的 1.2. 如何实现进程间通信 2. 管道通信 2.1. 匿名管道 2.1.1 创建匿名管道 2.1.2 . 深入理解匿名管道 2.2. 命名管道 2.2.1. 创建命名管道 3. system V 标准进程间通信 3.1. 共享内存 3.1.1. 实现原理 3.1.2. 代码实现 3…

认知智能理论三体论介绍简介

三体论是探索研究宇宙&#xff0c;信息和人类大脑三者关系的理论体系。是认知智能的奠基理论体系之一。宇宙和信息&#xff0c;信息和人类大脑&#xff0c;人类大脑和宇宙&#xff0c;三者之间存在着某种未被完全揭示的奥秘。三体论的核心思想体系就是基于宇宙&#xff0c;信息…

认知智能三大技术体系之类脑模型简介

认知智能三大技术体系之类脑模型简介 类脑模型是认知智能核心三大技术体系之一&#xff0c;类脑结构&#xff0c;功能机制的总称。类脑模型技术体系核心指导思想来自认知智能三大奠基理论&#xff0c;脑科学&#xff0c;心理学&#xff0c;逻辑学&#xff0c;情感学&#xff0c…

认知智能CI和人工智能AI的区别介绍简介

认知智能CI和人工智能AI的区别 人工智能和认知智能都是计算机科学的分支学科之一。人工智能是智能时代的第二个阶段&#xff0c;认知智能是智能时代的第三个阶段。认知智能也并不是智能时代发展的最终阶段&#xff0c;最终阶段应该是通用智能强智能时代。 本文主要就人工智能和…

什么是认知智能?

认知智能是计算机科学的一个分支科学&#xff0c;是智能科学发展的高级阶段&#xff0c;它以人类认知体系为基础&#xff0c;以模仿人类核心能力为目标&#xff0c;以信息的理解、存储、应用为研究方向&#xff0c;以感知信息的深度理解和自然语言信息的深度理解为突破口&#…

认知智能是什么?

认知智能是计算机科学的一个分支科学&#xff0c;是智能科学发展的高级阶段&#xff0c;它以人类认知体系为基础&#xff0c;以模仿人类核心能力为目标&#xff0c;以信息的理解、存储、应用为研究方向&#xff0c;以感知信息的深度理解和自然语言信息的深度理解为突破口&#…