与 QProcess 的符号(&)(非常命令执行)
Ampersand(&) (very command execute) with 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();`
问题出在和号 ("&") 中,returns 没有任何处理。
首先,让我们弄清楚执行单个命令时会发生什么,例如 pwd
。当您这样做时,shell 进程 forks (i.e. produces a child process), then the child process turns into pwd
进程并获得对终端的控制权。
接下来,如果您执行 pwd &
,同样的事情会发生,但是子进程(在我们的示例中为 pwd
)无法控制终端。它 运行 作为 后台 进程,而 shell 继续与终端一起工作。例如,您可能 运行 一个 GUI 程序 (firefox &
),shell 将立即准备 运行 下一个。
最后,当您执行 pwd & ls
时,所有与前一种情况相同的情况都发生了,但是 shell 又分叉了一次并且 运行s ls
在前景。正如您可能猜到的那样,pwd & ls &
会在后台生成两个进程 运行,并且您可以一次执行任意数量的命令。
现在让我们回到Qt。在 运行 命令之前 QProcess
不会 运行 任何 shell。因此,当您通过 QProcess
运行 pwd & ls
时,pwd
将是唯一执行的程序,但它 will get 有两个命令行参数:&
和 ls
。两者都将被忽略。
所以 pwd & ls
相当于 两个 QProcess
个对象,每个 运行ning 一个命令。
另一个解决方案是 运行 shell 明确地使参数被解析:
QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
我在上面使用 Qt 和 tcsh,需要执行如下命令:
tcsh: pwd & ls
在 Qt 中:
QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`
问题出在和号 ("&") 中,returns 没有任何处理。
首先,让我们弄清楚执行单个命令时会发生什么,例如 pwd
。当您这样做时,shell 进程 forks (i.e. produces a child process), then the child process turns into pwd
进程并获得对终端的控制权。
接下来,如果您执行 pwd &
,同样的事情会发生,但是子进程(在我们的示例中为 pwd
)无法控制终端。它 运行 作为 后台 进程,而 shell 继续与终端一起工作。例如,您可能 运行 一个 GUI 程序 (firefox &
),shell 将立即准备 运行 下一个。
最后,当您执行 pwd & ls
时,所有与前一种情况相同的情况都发生了,但是 shell 又分叉了一次并且 运行s ls
在前景。正如您可能猜到的那样,pwd & ls &
会在后台生成两个进程 运行,并且您可以一次执行任意数量的命令。
现在让我们回到Qt。在 运行 命令之前 QProcess
不会 运行 任何 shell。因此,当您通过 QProcess
运行 pwd & ls
时,pwd
将是唯一执行的程序,但它 will get 有两个命令行参数:&
和 ls
。两者都将被忽略。
所以 pwd & ls
相当于 两个 QProcess
个对象,每个 运行ning 一个命令。
另一个解决方案是 运行 shell 明确地使参数被解析:
QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();