2016-11-09 9 views
2

Я использую Qt и Tcsh над ним, нужно выполнить что-то вроде:Ampersand (&) (очень команду выполнить) с QProcess

tcsh: pwd & ls 

в Qt:

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

Проблема заключается в том в амперсанде («&»), и процесс ничего не возвращает.

ответ

1

Во-первых, давайте выясним, что происходит, когда вы выполняете одну команду, например 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(); 
+0

@elifmutlu Я проверил код и нашел, как передать аргументы оболочке. Вместо апострофов используйте экранированные дублеты. См. Отредактированный ответ. – Sergey

+0

да, это сработало правильно, спасибо –