본문 바로가기
프로그래밍/기타

[Linux, Qt] QProcess로 쉘 명령어, 프로그램 시작하는 방법

by GhostWeb 2021. 5. 14.
반응형

 

Qt에서 QProcess를 이용하여 프로그램이나, 명령어를 실행할 수 있으며 Arguments 값도 넣어 실행가능하고 터미널에서 명령어를 실행하여 나오는 결과 값도 받아 낼 수 있어요.

 

- 사용 방법

#include <QProcess>

int QProcess::execute(const QString &program, const QStringList &arguments)
void QProcess::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

○ 명령어, 프로그램 실행이 종료될 때까지 대기하기

bool QProcess::waitForFinished(int msecs = 30000)

- 설명

1. 사용자가 설정한 msecs를 기준으로 Process 작업이 완료 될 때까지 대기

2. msecs : 대기 시간 (-1 : 무한 / 30초 : 기본)

 

- 리턴 값

1. true  : 설정한 msecs내에 Process가 종료된 경우

2. false : 설정한 msecs를 초과 또는 waitForFinished() 이전에 Process가 종료되었을 경우

 

- 사용 예제

1. Ping 명령어를 실행 후 2초까지 대기.

2. Ping 명령어는 Process 종료 전까지 실행됨으로 대기 시간 2초를 경과하여 false 발생.

3. Ping 명령어를 실행 중인 Process는 아직 실행 중으로 kill()로 강제 종료.

#include <QProcess>
#include <QDebug>

QProcess process;
process.start("ping 127.0.0.1");

if (process.waitForFinished(2000) == false)
{
    qDebug() << "waitForFinished - false";
    process.kill();
}

process.close();

○ 명령어 실행 후 나올 때까지 대기 및 결과 읽기

bool QProcess::waitForStarted(int msecs = 30000)	// 시작 때까지 대기
bool QProcess::waitForReadyRead(int msecs = 30000)	// 읽을 때까지 대기
QByteArray QIODevice::readAll()

- 예제

QString output;
QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
process.start("who");

if (process.waitForReadyRead() == true)
{
    output = process.readAll();
}

qDebug() << output;
process.waitForFinished();
process.close();

- 실행 결과

14:22:42: Debugging starts
"ubuntu   :0           2021-05-09 21:24 (:0)\n"

○ 프로세스 강제 종료하기

void QProcess::kill()

○ 여러개의 명령어를 실행하기

#include <QProcess>

QProcess process;
process.start("sh");
process.write("ls -al . | grep testfile  > result.log");
process.closeWriteChannel();
process.waitForFinished();
process.readAll();
process.close();

- 실행 결과

ubuntu@ubuntu-VirtualBox:~/untitled/bin$ ls -al testfile 
-rw-rw-r-- 1 ubuntu ubuntu 20  4월 28 18:14 testfile

ubuntu@ubuntu-VirtualBox:~/untitled/bin$ cat result.log 
-rw-rw-r-- 1 ubuntu ubuntu      20  4월 28 18:14 testfile
반응형