QProcess实现进程通信

article/2025/9/14 10:29:27

QProcess实现进程通信的方式有点类似于管道。

QProcess父进程通过write来写入标准输入stdin,通过ReadyRead信号来接收子进程的消息。

QProcess子进程通过QFile来读取标准输入来接收父进程信息。通过QFile绑定QSocketNotifier来接收标准输入的实时信号,因为QSocketNotifier的activated信号可以通过标准输入是否有消息实时触发。

QProcess子进程通过QFile绑定标准输出stdout来发送消息给父进程。

注意:子进程读取信息不能通过QFile的readline等接口读取父进程信息,因为QFile他会读取标准输入的所有信息,并且不到长度就没有返回。哪怕QFile设置了读取长度,也会在满足长度后才有消息返回,我也不知为啥会这样。所有需要通过unstd.h的read接口来读取标准输入。

父进程:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QProcess>
#include <QtWidgets>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void slotopenprocess();void slotsenddata();void slotfinish(int code);void slotreaddata();
private:Ui::MainWindow *ui;QPushButton* m_btn;QPushButton* m_sendbtn;QLineEdit* m_edit;QTextEdit* m_readedit;QProcess* m_process;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("server");m_btn = new QPushButton("打开进程",this->centralWidget());m_sendbtn = new QPushButton("发送",this->centralWidget());m_edit = new QLineEdit(this);m_readedit = new QTextEdit(this);m_process = new QProcess(this);QVBoxLayout* lay = new QVBoxLayout(this);lay->addWidget(m_btn);lay->addWidget(m_edit);lay->addWidget(m_sendbtn);lay->addWidget(m_readedit);lay->addWidget(m_sendbtn);this->centralWidget()->setLayout(lay);connect(m_btn,SIGNAL(clicked()),this,SLOT(slotopenprocess()));connect(m_sendbtn,SIGNAL(clicked()),this,SLOT(slotsenddata()));connect(m_process,SIGNAL(finished(int)),this,SLOT(slotfinish(int)));connect(m_process,SIGNAL(readyRead()),this,SLOT(slotreaddata()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slotopenprocess()
{m_process->start("/home/yjd/yjd/test/myprocess/myprocess");
}void MainWindow::slotsenddata()
{if (m_process->isOpen())m_process->write(m_edit->text().toUtf8());
}void MainWindow::slotfinish(int code)
{qWarning()<<"process finish"<<code<<m_process->readAllStandardOutput();
}void MainWindow::slotreaddata()
{m_readedit->append(QString("接收消息:%1").arg(m_process->readAllStandardOutput().data()));
}

子进程:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QProcess>
#include <QtWidgets>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void slotopenprocess();void slotsenddata();void slotfinish(int code);void slotreaddata(int fd);
private:Ui::MainWindow *ui;QPushButton* m_btn;QPushButton* m_sendbtn;QLineEdit* m_edit;QTextEdit* m_readedit;QProcess* m_process;QSocketNotifier* m_clientsocket;QFile m_file;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <unistd.h>
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("client");m_btn = new QPushButton("打开进程",this->centralWidget());m_sendbtn = new QPushButton("发送",this->centralWidget());m_edit = new QLineEdit(this);m_readedit = new QTextEdit(this);m_process = new QProcess(this);QVBoxLayout* lay = new QVBoxLayout(this);lay->addWidget(m_btn);lay->addWidget(m_edit);lay->addWidget(m_sendbtn);lay->addWidget(m_readedit);lay->addWidget(m_sendbtn);this->centralWidget()->setLayout(lay);connect(m_btn,SIGNAL(clicked()),this,SLOT(slotopenprocess()));connect(m_sendbtn,SIGNAL(clicked()),this,SLOT(slotsenddata()));connect(m_process,SIGNAL(finished(int)),this,SLOT(slotfinish(int)));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slotopenprocess()
{m_file.open(stdin, QFile::ReadOnly);if (m_file.isOpen()){m_clientsocket = new QSocketNotifier(m_file.handle(), QSocketNotifier::Read,this);connect(m_clientsocket,SIGNAL(activated(int)),this,SLOT(slotreaddata(int)));QMessageBox::information(this,"title","open success");}
}void MainWindow::slotsenddata()
{QFile file;file.open(stdout, QFile::WriteOnly);file.write(m_edit->text().toUtf8());
}void MainWindow::slotfinish(int code)
{qWarning()<<"process finish"<<code<<m_process->readAllStandardOutput();
}void MainWindow::slotreaddata(int fd)
{if(fd != m_file.handle() )return;char buf[128] = {0};read(fd,buf,sizeof(buf));     //不建议使用m_file.readLine(5)来读取返回值m_readedit->append(QString::fromUtf8("接收消息:%1").arg(buf));}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/7KZIJVaM.shtml

相关文章

进程通信原理

目录 进程通信原理 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;以感知信息的深度理解和自然语言信息的深度理解为突破口&#…

人工智能导论

目录 1.1 人工智能导论 1.2 人工智能应用 1.3 人工智能产业发展 1.4 人工智能发展的成功因素 1.5 人工智能迅速发展的技术领域 1.6人工智能的基础知识 1.1 人工智能导论 人工智能的三个层面&#xff1a; 计算智能&#xff1a;能算能存 感知智能&#xff1a;能听会说&…

如何用AI技术增强企业认知智能?超详细架构解读

认知的高度决定了创造价值的高度。 企业在从创办、发展、竞争、成功到衰亡的全生命周期中&#xff0c;会面临复杂多样的决策场景。 然而&#xff0c;时代演变产生的海量、分散、实时的信息&#xff0c;仅靠人类个体是难以高效、准确地感知、认知和决策的。 因此&#xff0c;企…

深度KWeaver:价值驱动,认知智能走向开源共创

文|智能相对论 作者|叶远风 在底层硬件创新之外&#xff0c;软件创新对提升中国前沿科技竞争力同样重要&#xff0c;这其中&#xff0c;开源的必要性毋庸置疑。但是&#xff0c;在全球范围内开源项目硕果累累的大背景下&#xff0c;中国开源过去的发展却不够快&#xff0c;直…

AI的下一个战场:认知智能的突围

2020-01-20 14:32 导语&#xff1a;AI的下一种可能 “深度学习的钥匙丢在了黑暗角落。”张钹院士不止一次提出这个论点。深度学习方法易受欺骗、易受攻击已经是研究者们达成的共识&#xff0c;追其根本原因&#xff0c;张钹归结为&#xff1a;大家只是在灯亮的方向对模型修修补…

认知智能介绍发展道翰天琼

计算智能、感知智能和认知智能&#xff0c;是探索人工智能道路上的三个台阶。 在计算智能方面&#xff0c;机器早已远远超过人类。而在感知智能方面&#xff0c;机器也已达到可媲美人类的水平。科大讯飞在语音识别错误率上每年相对下降30%以上。在2018年CHiME-5国际多通道语音分…

【干货】认知智能时代:知识图谱实践案例集.pdf(附下载链接)

大家好&#xff0c;我是文文&#xff08;微信号&#xff1a;sscbg2020&#xff09;&#xff0c;今天给大家分享中国电子技术标准化研究院于2021年1月份发布的干货报告《认知智能时代&#xff1a;知识图谱实践案例集.pdf》&#xff0c;关注知识图谱及人工智能伙伴们别错过了&…

肖仰华:知识图谱与认知智能

今天跟大家分享的主题是《知识图谱与认知智能》。 知识图谱自2012年提出至今&#xff0c;发展迅速&#xff0c;如今已经成为人工智能领域的热门问题之一&#xff0c;吸引了来自学术界和工业界的广泛关注&#xff0c;在一系列实际应用中取得了较好的落地效果&#xff0c;产生了巨…

【认知智能】邓志东教授:如何迈向认知智能与通用人工智能

中国金融信息网讯 9月10日-13日&#xff0c;2017世界物联网博览会在无锡召开&#xff0c;清华大学计算机科学与技术系教授邓志东在网易AI公开课上介绍了人工智能现状和复兴原因&#xff0c;及其商业价值和中国人工智能产业发展的优势和短板&#xff0c;以及如何迈向认知智能与通…

智能发展的四个层次:运算智能,感知智能,认知智能,强智能。道翰天琼认知智能。

2016年&#xff0c;人工智能成为产业界和学术界的大热词。年初&#xff0c;李世石与Alpha Go的人机围棋大战吸睛无数&#xff0c;人工智能的话题始料未及地席卷了世界每处。此外&#xff0c;今年也恰逢人工智能学科诞生一甲子&#xff0c;Alpha Go再一次打败人类&#xff0c;受…