• qt使用QProcess实现进程通信


    目录

    要点

    父进程发向子进程:

    父进程一侧

    子进程一侧

    子进程发向父进程:

    子进程一侧

    父进程一侧

    代码

    父进程代码:

    子进程代码:

    效果


    本文介绍在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获取信息。

    代码

    父进程代码:

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. namespace Ui {
    6. class MainWindow;
    7. }
    8. class MainWindow : public QMainWindow
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit MainWindow(QWidget *parent = 0);
    13. ~MainWindow();
    14. private:
    15. Ui::MainWindow *ui;
    16. QProcess * m_pProc;
    17. private slots:
    18. void OnFinish(int);
    19. };
    20. #endif // MAINWINDOW_H
    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. MainWindow::MainWindow(QWidget *parent) :
    4. QMainWindow(parent), m_pProc(nullptr),
    5. ui(new Ui::MainWindow)
    6. {
    7. ui->setupUi(this);
    8. m_pProc = new QProcess();
    9. connect(ui->BtnSend, &QPushButton::clicked, [this](){
    10. if(m_pProc && m_pProc->isOpen())
    11. {
    12. QString qstrSend = ui->lineEdit->text();
    13. m_pProc->write(qstrSend.toUtf8());
    14. }
    15. });
    16. connect(m_pProc, &QProcess::readyRead, [this](){
    17. QString qstr(m_pProc->readAllStandardOutput());
    18. ui->label->setText(qstr);
    19. });
    20. connect(m_pProc, SIGNAL(finished(int)), this, SLOT(OnFinish(int)));
    21. m_pProc->start("./subProc");
    22. setWindowTitle("Main");
    23. }
    24. MainWindow::~MainWindow()
    25. {
    26. if(m_pProc)
    27. delete m_pProc;
    28. delete ui;
    29. }
    30. void MainWindow::OnFinish(int)
    31. {
    32. delete m_pProc;
    33. m_pProc = nullptr;
    34. }

    子进程代码:

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. namespace Ui {
    7. class MainWindow;
    8. }
    9. class MainWindow : public QMainWindow
    10. {
    11. Q_OBJECT
    12. public:
    13. explicit MainWindow(QWidget *parent = 0);
    14. ~MainWindow();
    15. private:
    16. QFile m_file;
    17. QSocketNotifier * m_pNotifier;
    18. Ui::MainWindow * ui;
    19. char m_arrRecv[128];
    20. private slots:
    21. void OnRead(int);
    22. void OnSend(void);
    23. };
    24. #endif // MAINWINDOW_H
    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent) :
    5. QMainWindow(parent),
    6. ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. m_file.open(0, QFile::WriteOnly);//0=stdin
    10. m_pNotifier = new QSocketNotifier(m_file.handle(), QSocketNotifier::Read, this);
    11. connect(m_pNotifier, SIGNAL(activated(int)), this, SLOT(OnRead(int)));
    12. connect(ui->BtnSend, &QPushButton::clicked, this, &MainWindow::OnSend);
    13. setWindowTitle("sub");
    14. }
    15. MainWindow::~MainWindow()
    16. {
    17. delete ui;
    18. }
    19. void MainWindow::OnRead(int iHandle)
    20. {
    21. if(m_file.handle() == iHandle)
    22. {
    23. int iRet = read(m_file.handle(), m_arrRecv, sizeof(m_arrRecv));
    24. m_arrRecv[iRet] = 0;
    25. ui->label->setText(QString("%1").arg(m_arrRecv));
    26. }
    27. }
    28. void MainWindow::OnSend(void)
    29. {
    30. QFile file;
    31. file.open(1, QFile::WriteOnly);//1==stdout
    32. file.write(ui->lineEdit->text().toUtf8());
    33. file.close();
    34. }

    效果

  • 相关阅读:
    频繁的需求变更,让你痛苦过吗?
    剖析WPF模板机制的内部实现
    5.SpringBoot⾼级配置
    我又又又把Kubernetes整理了一次
    JDBC数据库事务
    Invertible Image Signal Processing 可逆图像信号处理
    自制Linux精简系统
    html实现好看的导航主页(附源码)
    OSCP系列靶场-Esay-Gaara保姆级
    Mac用命令行安装Adobe代码字体Source Code Pro
  • 原文地址:https://blog.csdn.net/liji_digital/article/details/127556469