과 내가 그 위에 Qt를하고 tcsh를 사용하고 (매우 실행 명령), 무언가 같이 실행해야 앰퍼샌드 ("&")이며 프로세스는 아무 것도 반환하지 않습니다.앰퍼샌드 (&) QProcess
2
A
답변
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();
@elifmutlu 내가 코드를 테스트 쉘에 인수를 전달하는 방법을 발견했다. 아포스트로피 대신 이스케이프 처리 된 이중화를 사용하십시오. 편집 된 답변을 참조하십시오. – Sergey
예, 제대로 작동했습니다. 감사합니다. –