目录
本文介绍在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();
- }