和号(&)(非常命令执行)与 QProcess
Posted
技术标签:
【中文标题】和号(&)(非常命令执行)与 QProcess【英文标题】:Ampersand(&) (very command execute) with QProcess 【发布时间】:2016-11-09 05:45:51 【问题描述】:我正在使用 Qt 和 tcsh,需要执行以下操作:
tcsh: pwd & ls
在 Qt 中:
QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`
问题出在与号(“&”)中,进程什么也不返回。
【问题讨论】:
【参考方案1】:首先,让我们弄清楚当你执行一个命令时会发生什么,比如pwd
。当你这样做时,shell进程forks(即产生一个子进程),然后子进程turns intopwd
进程并获得对终端的控制。
接下来,如果你执行pwd &
,同样的事情会发生,但是子进程(在我们的例子中是pwd
)不能控制终端。它作为 后台 进程运行,而 shell 继续与终端一起工作。例如,您可以运行一个 GUI 程序 (firefox &
),然后 shell 将准备好立即运行下一个程序。
最后,当您执行pwd & ls
时,会发生与前一种情况相同的情况,但是shell 再分叉一次并在前台运行ls
。正如您可能猜到的那样,pwd & ls &
产生的两个进程都在后台运行,您可以一次执行任意数量的命令。
现在让我们回到 Qt。 QProcess
在运行命令之前不运行任何 shell。因此,当您通过QProcess
运行pwd & ls
时,pwd
将是唯一执行的程序,但它will get 有两个命令行参数:&
和ls
。两者都将被忽略。
所以pwd & ls
的等价物将是两个 QProcess
对象,每个对象运行一个命令。
另一种解决方案是显式运行 shell 以使参数被解析:
QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
【讨论】:
@elifmutlu 我测试了代码并找到了如何将参数传递给 shell。使用转义的双引号代替撇号。请参阅编辑后的答案。以上是关于和号(&)(非常命令执行)与 QProcess的主要内容,如果未能解决你的问题,请参考以下文章