我使用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;),并且进程没有返回任何内容。
答案 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