Во-первых, давайте выясним, что происходит, когда вы выполняете одну команду, например pwd
. Когда вы это делаете, процесс оболочки forks (т. Е. Производит дочерний процесс), то дочерний процесс turns intopwd
обрабатывает и получает контроль над терминалом.
Далее, если вы выполните pwd &
, все равно произойдет, но дочерний процесс (pwd
в нашем примере) не получает контроль над терминалом. Он работает как процесс , а оболочка продолжает работать с терминалом. Например, вы можете запустить GUI-программу (firefox &
), и оболочка будет готова немедленно запустить следующую.
И наконец, когда вы выполняете pwd & ls
, все равно, что и в предыдущем случае, но оболочка вилки еще раз и запускает ls
на переднем плане. Как вы могли догадаться, pwd & ls &
дает оба процесса, выполняемые в фоновом режиме, и вы можете выполнять столько команд, сколько хотите сразу.
Теперь вернемся к Qt. QProcess
не запускает оболочку перед запуском команды. Таким образом, когда вы запускаете pwd & ls
через QProcess
, pwd
будет единственной программой, выполненной, но она will get двумя аргументами командной строки: &
и ls
. Оба они будут проигнорированы.
Таким образом, эквивалент pwd & ls
будет QProcess
объектов, каждый из которых выполняет одну команду.
Другим решением является запуск оболочки явно сделать аргументы разбираемым:
QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
@elifmutlu Я проверил код и нашел, как передать аргументы оболочке. Вместо апострофов используйте экранированные дублеты. См. Отредактированный ответ. – Sergey
да, это сработало правильно, спасибо –