Windows下利用共享内存和事件对象实现进程间的通讯
本来项目想用一个第三方数据处理库,结果不知道有什么冲突,第三方库编译的dll死活就是调用不了。想想干脆再把第三方库写成一个exe得了。之前对windows的IPC机制也不熟,估计跟linux也有很多相似的地方,就先实现个简单的模型。
源代码:
https://github.com/wrsjhhe/IPC_win
先说一下需求:
1.在同一个计算机上,有两个进程,一个作为客户进程,一个作为服务进程;
2.客户进程会把数据发送给服务进程做处理,然后服务进程把处理好的数据返回回来;
3.数据量不确定,可能比较大;
4.数据处理功能类型可能有多种;
5.客户进程是一个命令处理完后才能发下一个命令。
实现方案:
进程间的数据传输用共享内存来实现,进程间的同步用event来实现,这两个方式都是比较高效的;
一个共享内存;
两个event对象,一个是客户端用来给服务端发通知,一个是服务端把数据处理好了给客户端发通知;
对两端的数据处理功能都用std::function来注册。
由于是同步进行的,所以不需要多线程(如果有需求的话也可以增加多线程模块)
流程:
1.首先服务进程建立一个共享内存,并把需要的功能以std::function注册到一个容器中保存,然后开启对命令事件的监听循环。
2.然后客户进程开启,把命令与数据都写入共享内存中,然后主动触发发送事件,并开始监听数据返回事件。
3.服务端监听到事件触发,开始处理,这时候两端都是阻塞的。直到数据处理完毕,把数据写入共享内存,触发数据返回事件。
4.客户端接收到返回数据,回调事件处理数据,结束。
单次循环的事件处理就是下面这个样子: