• QT之QProcess


    类描述信息

     QProcess允许您将进程视为顺序I/O设备。您可以写入和读取进程,就像使用QTcpSocket访问网络连接一样。然后,您可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。由于QProcess继承了QIODevice,因此它也可以用作QXmlReader的输入源,或者用于生成要使用QNetworkServer Manager上传的数据。

    启动进程

    要启动一个进程,将要运行的程序的名称和命令行参数作为参数传递给start()。参数作为QStringList中的单个字符串提供。或者,您可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。

    1. QObject *parent;
    2. ...
    3. QString program = "./path/to/Qt/examples/widgets/analogclock";
    4. QStringList arguments;
    5. arguments << "-style" << "fusion";
    6. QProcess *myProcess = new QProcess(parent);
    7. myProcess->start(program, arguments);

    然后QProcess进入Starting状态,当程序启动时,QProcess进入Running状态并发出started()。

    通道通信

    进程具有两个预定义的输出通道:

    1. 标准输出通道(stdout)提供常规控制台输出。
    2. 标准错误通道(stderr)通常提供由进程打印的错误。

    这些通道代表两个单独的数据流,可以通过调⽤setReadChannel()函数在它们之间切换。当前读取通道上有可⽤数据时,QProcess发出readyRead()信号。当有新的标准输出数据可⽤时,它也会发出readyReadStandardOutput()信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。⽆需调⽤read()函数,readLine()函数或getChar()函数,⽽是可以通过调⽤readAllStandardOutput()函数或readAllStandardError()函数显式地从两个通道之⼀读取所有数据

    查看CUP ID命令

    1. QProcess p;
    2. p.start("dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");

    以将整个命令作为sh的参数传入 或 使用QProcess::setStandardOutputProcess(QProcess *destination)即将一个进程的标准输出流传入目标进程的标准输入流:

    1. //将整个命令作为sh的参数传入
    2. QProcess p;
    3. p.start("sh", QStringList() << "-c" << "dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");
    4. p.waitForFinished();
    5. QString str = p.readAllStandardOutput();
    6. qDebug() << str;
    7. //使用setStandardOutputProcess()
    8. QProcess process1;                                
    9. QProcess process2;                                
    10. QProcess process3;                                
    11. QProcess process4;                                
    12.                                                   
    13. process1.setStandardOutputProcess(&process2);     
    14. process2.setStandardOutputProcess(&process3);     
    15. process3.setStandardOutputProcess(&process4);     
    16.                                                   
    17. process1.start("sudo fdisk -l");                  
    18. process2.start("grep ID");                        
    19. process3.start("sort -u");                        
    20. process4.start("awk", {"-F", ": ", "{print $2}"});
    21.                                                   
    22. process4.waitForFinished(); //等待最后一个命令执行完成               
    23. QString str = process4.readAllStandardOutput();     
    24. qDebug() << str;    

     退出

    1. void kill()
    2. void terminate()

    kill(),作用是杀死当前进程使之退出。这个函数也是调用平台相关的 API,如在 Windows 上调用 TerminateProcess,而在 Unix 和 macOS 上是将 SIGKILL 信号发送到进程中。
    terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。在 Windows 上是发送 WM_CLOSE 到进程的顶级窗口,然后发到进程本身的主线程,而 在 Unix 和 macOS 上是发送 SIGTERM 信号。注意在 Windows 上,没有事件循环或者不处理 WM_CLOSE 消息的控制台程序只能调用 kill() 来终止。

                         

  • 相关阅读:
    【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解
    Flink cdc 2.3.0 日前发布,支持众多新特性
    第四十三章 在CSP应用程序中本地化文本 - 本地化的基础
    Flutter混合栈管理
    包分配并不是个好制度
    Redis对象系统
    Maven
    stdlib.h
    基于JavaSwing开发模拟电梯系统+分析报告 课程设计 大作业源码
    阿里P8大佬,耗时72小时整理的Docker实战笔记,你值得拥有
  • 原文地址:https://blog.csdn.net/qq_44632658/article/details/134376707