2016-11-09 4 views
2

과 내가 그 위에 Qt를하고 tcsh를 사용하고 (매우 실행 명령), 무언가 같이 실행해야 앰퍼샌드 ("&")이며 프로세스는 아무 것도 반환하지 않습니다.앰퍼샌드 (&) QProcess

답변

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

예, 제대로 작동했습니다. 감사합니다. –