首页 > Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

概述

传统的多进程间通信往往非常麻烦,采用的方法比如管道,共享内存,socket,文件等,大都非常繁琐,

1、现利用Qt实现了一种类似于使用线程的方式来通过信号槽通信的进程间通信方法

2、大致思路是利用linux API 的vfork实现了多进程共享内存空间,再加上Qt的信号槽实现了事件分发通知,实现了多进程的简单高效通信。

3、fork 创建子进程,子进程有自己独立的数据空间,只共享代码段,子进程的数据空间从创建是从父进程完全复制过来,

4、vfork创建子进程,子进程与父进程共享数据空间,但是子进程会阻塞父进程里用来创建子进程的线程,直到子进程结束才返回,

类结构

PalmSensorManager 父进程类

PalmCaptureProccess 子进程类

CrossProccessNotifier 子进程通知类, 用于将创建的子进程对象的指针发送给父进程

LambdaThreadObject 线程类

实现

1、全局的进程创建结果通知类 CrossProccessNotifier

在这里插入图片描述

在这里插入图片描述

2、创建子线程, 在线程里创建子进程

在子进程运行的过程中,该线程会一直阻塞,知道子进程结束才, 返回pid>0

createProccessForPalmSensor(devName); 函数里创建了子进程

创建进程的函数

createProccessForPalmSensor()

函数:

 ```g_newProccessNotifier.emitSigNewProccessCreated(deviceName, proccessPtr); //通知父进程 新的掌脉进程已经创建完毕
用于通知父进程, 将子进程里对象的指针传给父进程,用于做进程管理,注意
子线程不能用从QThread派生的方式,否则子进程会发生段错误,导致子父进程都崩溃
多进程情况下,fork时,父进程的程序会被复制, 原来的socket,文件,定时器都会有两份,应该注意这一点,
vfork的情况下,则没有这种情况,子进程和父进程共享数据空间

更多相关:

  • 在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广度和深度。本文从浏览器角度来告诉你,URL后输入后按回车,浏览器内部究竟发生了什么,读完本文后,你将了解到:浏览器内有哪些进程,这些...

  • 进程与线程进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1]。比如,打开一个word文件就是启动了一个word进程。线程(thread)是进程内的子任务。比如word中可以进行编辑、拼写检查和打印等子任务。我们目前的操作系统都是多任务的操作系统,多任务的实现方式[2]:多进程多线程多进程 + 多线程多进程:...

  • 运行cmd netstat -aon|findstr 80 然后 taskkill -f -pid 32428(这个就是pid进程编号) 回车   进程死翘翘了~ 去愉快玩耍吧~哦对了 别忘记一健三联关注我哟~...

  • 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网...

  • 1.      SIGTERM “kill pid” 会发送SIGTERM到进程pid. This is the termination signal sent by killcommand by default. 2.      SIGINT 在终端中敲入interrupt key(DELETE或ctrl+c)会产生SIG...

  • 为了方便创建Component,请自行安装插件       接下来就是创建组件需要绑定入参in和事件out(用于输出参数)  运行效果如下(可以点击红色文字,就获取到了子组件传出的内容)...

  • 第1步 在stmg/src/main/webapp/subsystem下创建一个newPage文件夹 在newPage文件夹下新建一个newSubPage.jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <%String pat...

  • 学习在Substance Designer中创建复杂材料的高级技术。 如果你想进入游戏行业,想学习如何创建高质量的纹理和学习物质设计,那么这个课程是给你的。 我设计了这个课程,从一开始就带你,教你我用来创建AAA纹理的3个步骤:图案,雕刻和细节。 看完这个课程后,你会觉得非常有信心创造一个AAA级纹理,你可以把它放在你的作品集里...

  • 了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建强大且通用的人工智能 创造具有多重能力的角色 创建级别组件 MP4 |视频:h264,1280×720 |音频:AAC,44.1...

  • 在Unity中学习高级粒子系统和视觉效果创建。初级到中级 你会学到: 游戏的视觉效果 Unity粒子系统 Unity中的Vfx 创建Unity视觉效果的初级到中级指南 课程获取:Unity粒子系统创建VFX游戏特效学习教程-云桥网 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言...

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...