类描述信息
QProcess允许您将进程视为顺序I/O设备。您可以写入和读取进程,就像使用QTcpSocket访问网络连接一样。然后,您可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。由于QProcess继承了QIODevice,因此它也可以用作QXmlReader的输入源,或者用于生成要使用QNetworkServer Manager上传的数据。
启动进程
要启动一个进程,将要运行的程序的名称和命令行参数作为参数传递给start()。参数作为QStringList中的单个字符串提供。或者,您可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。
cpp
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
然后QProcess进入Starting状态,当程序启动时,QProcess进入Running状态并发出started()。
通道通信
进程具有两个预定义的输出通道:
- 标准输出通道(stdout)提供常规控制台输出。
- 标准错误通道(stderr)通常提供由进程打印的错误。
这些通道代表两个单独的数据流,可以通过调⽤setReadChannel()函数在它们之间切换。当前读取通道上有可⽤数据时,QProcess发出readyRead()信号 。当有新的标准输出数据可⽤时,它也会**发出readyReadStandardOutput()**信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。⽆需调⽤read()函数,readLine()函数或getChar()函数,⽽是可以通过调⽤readAllStandardOutput()函数或readAllStandardError()函数显式地从两个通道之⼀读取所有数据
查看CUP ID命令
QProcess p;
p.start("dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");
以将整个命令作为sh的参数传入 或 使用QProcess::setStandardOutputProcess(QProcess *destination)即将一个进程的标准输出流传入目标进程的标准输入流:
cpp
//将整个命令作为sh的参数传入
QProcess p;
p.start("sh", QStringList() << "-c" << "dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");
p.waitForFinished();
QString str = p.readAllStandardOutput();
qDebug() << str;
//使用setStandardOutputProcess()
QProcess process1;
QProcess process2;
QProcess process3;
QProcess process4;
process1.setStandardOutputProcess(&process2);
process2.setStandardOutputProcess(&process3);
process3.setStandardOutputProcess(&process4);
process1.start("sudo fdisk -l");
process2.start("grep ID");
process3.start("sort -u");
process4.start("awk", {"-F", ": ", "{print $2}"});
process4.waitForFinished(); //等待最后一个命令执行完成
QString str = process4.readAllStandardOutput();
qDebug() << str;
退出
cpp
void kill()
void terminate()
kill(),作用是杀死当前进程使之退出。这个函数也是调用平台相关的 API,如在 Windows 上调用 TerminateProcess,而在 Unix 和 macOS 上是将 SIGKILL 信号发送到进程中。
terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。在 Windows 上是发送 WM_CLOSE 到进程的顶级窗口,然后发到进程本身的主线程,而 在 Unix 和 macOS 上是发送 SIGTERM 信号。注意在 Windows 上,没有事件循环或者不处理 WM_CLOSE 消息的控制台程序只能调用 kill() 来终止。