Предположим, что мы хотим запустить приложение внешней командной строки, например, "dir", и предположим, что оно вылетает:
namespace util
{
bool execChildProcess(const std::string & cmd, std::string & cmdOutput)
{
QProcess process;
QString qStrCmd = QString::fromStdString(cmd);
process.start(qStrCmd);
if(process.exitStatus() == QProcess::Crashed )
{
std::cout<<"QProcess::Crashed"<<std::endl;
process.kill();
}
if(process.waitForFinished() && process.exitStatus() == QProcess::NormalExit )
{
QString output(process.readAllStandardOutput());
cmdOutput = output.toStdString();
std::cout<<"Result: "<<cmdOutput<<std::endl;
return true;
}
else
{
switch(process.error())
{
case QProcess::FailedToStart :
std::cout<<"QProcess::FailedToStart"<<std::endl;
break ;
case QProcess::Crashed :
std::cout<<"QProcess::Crashed"<<std::endl;
break ;
case QProcess::Timedout:
std::cout<<"QProcess::Timedout"<<std::endl;
break ;
case QProcess::WriteError:
std::cout<<"QProcess::WriteError"<<std::endl;
break ;
case QProcess::ReadError:
std::cout<<"QProcess::ReadError"<<std::endl;
break ;
case QProcess::UnknownError:
std::cout<<"QProcess::UnknownError"<<std::endl;
break ;
}
process.kill();
}
return false;
}
}
int main(int argc, char* argv[])
{
std::string output;
bool res = util::execChildProcess("dir", output);
}
сбой отслеживается после закрытия этого сообщения:
После закрытия сообщения код завершает процесс, но не раньше.
Как мы можем избежать этого сообщения с помощью QProcess (я не знаю, происходит ли это также в Ubuntu, но я хотел бы кросс-платформенное решение на случай, если оно также произойдет в Ubuntu).