首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QProcess执行Ampersand(&) (非常命令执行)

使用QProcess执行Ampersand(&) (非常命令执行)
EN

Stack Overflow用户
提问于 2016-11-09 05:45:51
回答 1查看 483关注 0票数 2

我对它使用了Qt和tcsh,需要执行如下内容:

代码语言:javascript
复制
tcsh: pwd & ls

在Qt中:

代码语言:javascript
复制
QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`

问题出现在符号("&")中,进程没有返回任何内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 07:49:50

首先,让我们了解执行单个命令(如pwd )时会发生什么。当您这样做时,shell进程叉子 (即生成子进程),然后子进程转成 pwd进程并获得对终端的控制。

接下来,如果执行pwd &,也会发生同样的情况,但是子进程(在我们的示例中是pwd)无法控制终端。它作为后台进程运行,而shell继续与终端一起工作。例如,您可以运行一个GUI程序(firefox &),并且shell将准备好立即运行下一个程序。

最后,当您执行pwd & ls时,与前面的情况一样,但是shell再次分叉,并在前台运行ls。正如您可能猜到的那样,pwd & ls &生成在后台运行的两个进程,您可以一次执行任意多个命令。

现在让我们回到Qt。在运行命令之前,QProcess不运行任何shell。因此,当您通过pwd & ls通过QProcess运行时,pwd将是唯一执行的程序,但它只执行两个命令行参数:&ls。他们两个都会被忽视。

因此,相当于pwd & ls的是两个QProcess对象,每个对象运行一个命令。

另一种解决方案是显式地运行shell以使参数被解析:

代码语言:javascript
复制
QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40500718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档