目录
要点
父进程发向子进程:
父进程一侧
子进程一侧
子进程发向父进程:
子进程一侧
父进程一侧
代码
父进程代码:
子进程代码:
效果
本文介绍在linux下实现父子进程通信的方法。完整项目见我的资源qt使用QProcess实现父子进程通信,适用linux平台-C++文档类资源-CSDN下载
QProcess::write发出信息
父进程发来的信息进入stdin。在linux环境下,stdin ==0
子进程用QFile接收stdin的信息。当QFile接到信息时,通过QSocketNotifier自动发出信号activated
程序员应在子进程中设置一个槽函数响应activated。槽函数中调用read()函数从stdin中获取数据。注意,根据QProcess实现进程通信_东方忘忧的博客-CSDN博客_qprocess进程间通信的说法:
子进程读取信息不能通过QFile的readline等接口读取父进程信息,因为QFile他会读取标准输入的所有信息,并且不到长度就没有返回。哪怕QFile设置了读取长度,也会在满足长度后才有消息返回,我也不知为啥会这样。所有需要通过unistd.h的read接口来读取标准输入。
子进程发出的信息应通过stdout进入主进程,在linux下,stdout=1
将QFile与stdout结合在一起,通过QFile::write向stdout写入信息。但我估计直接用unistd.h的write接口也可以。
QProcess自动发出readyRead信号。程序员应设计一个槽函数与该信号关联。在这个槽函数里面调用QProcess::readAllStandardOutput获取信息。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QProcess * m_pProc;
private slots:
void OnFinish(int);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), m_pProc(nullptr),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pProc = new QProcess();
connect(ui->BtnSend, &QPushButton::clicked, [this](){
if(m_pProc && m_pProc->isOpen())
{
QString qstrSend = ui->lineEdit->text();
m_pProc->write(qstrSend.toUtf8());
}
});
connect(m_pProc, &QProcess::readyRead, [this](){
QString qstr(m_pProc->readAllStandardOutput());
ui->label->setText(qstr);
});
connect(m_pProc, SIGNAL(finished(int)), this, SLOT(OnFinish(int)));
m_pProc->start("./subProc");
setWindowTitle("Main");
}
MainWindow::~MainWindow()
{
if(m_pProc)
delete m_pProc;
delete ui;
}
void MainWindow::OnFinish(int)
{
delete m_pProc;
m_pProc = nullptr;
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QFile m_file;
QSocketNotifier * m_pNotifier;
Ui::MainWindow * ui;
char m_arrRecv[128];
private slots:
void OnRead(int);
void OnSend(void);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_file.open(0, QFile::WriteOnly);//0=stdin
m_pNotifier = new QSocketNotifier(m_file.handle(), QSocketNotifier::Read, this);
connect(m_pNotifier, SIGNAL(activated(int)), this, SLOT(OnRead(int)));
connect(ui->BtnSend, &QPushButton::clicked, this, &MainWindow::OnSend);
setWindowTitle("sub");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnRead(int iHandle)
{
if(m_file.handle() == iHandle)
{
int iRet = read(m_file.handle(), m_arrRecv, sizeof(m_arrRecv));
m_arrRecv[iRet] = 0;
ui->label->setText(QString("%1").arg(m_arrRecv));
}
}
void MainWindow::OnSend(void)
{
QFile file;
file.open(1, QFile::WriteOnly);//1==stdout
file.write(ui->lineEdit->text().toUtf8());
file.close();
}