带有QProcess的&符号(&)(非常命令执行)

时间:2016-11-09 05:45:52

标签: c++ linux qt external qprocess

我使用Qt和tcsh,需要执行如下操作:

tcsh: pwd & ls
在Qt中

QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`

问题出在&符号中(&#34;&amp;&#34;),并且进程没有返回任何内容。

1 个答案:

答案 0 :(得分:2)

首先,让我们弄清楚执行单个命令时会发生什么,例如pwd。执行此操作时,shell进程forks(即生成子进程),然后子进程turns into pwd处理并获取对终端的控制权。

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

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

现在让我们回到Qt。 QProcess在运行命令之前不运行任何shell。因此,当您通过pwd & ls运行QProcess时,pwd将是唯一执行的程序,但will get两个命令行参数:&和{{1} }}。两者都将被忽略。

因此,ls的等价物将是两个 pwd & ls个对象,每个对象都运行一个命令。

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

QProcess