首页 > 解决方案 > QProcess.start 不返回退出状态或退出代码

问题描述

我目前正在使用从 C++ 应用程序运行 Linux 命令,并且在使用函数QProcess时我有一个奇怪的行为。QProcess::start

这个最小的例子说明即使进程失败,QProcess::exitStatus()即使QProcess::exitCode()返回良好的退出代码,进程退出状态也被认为是成功的。

int main(int argc, char *argv[])
{
    QProcess process;

    process.start("sleep a");
    process.waitForFinished();
    process.close();

    if(QProcess::NormalExit == process.exitStatus())
    {
        qCritical() << "SUCCESS : " + QString::number(process.exitCode());
    }
    else
    {
        qCritical() << "ERROR : " + QString::number(process.exitCode());
    }
}

输出

$ ./test 
"SUCCESS : 1"

我发现 usingProcess::execute而不是Process::start不会改变任何关于的内容Process::exitStatus,更糟糕的是因为Process::exitCode不再返回 1 。

int main(int argc, char *argv[])
{
    QProcess process;

    qCritical() << process.execute("sleep a");

    if(QProcess::NormalExit == process.exitStatus())
    {
        qCritical() << "SUCCESS : " + QString::number(process.exitCode());
    }
    else
    {
        qCritical() << "ERROR : " + QString::number(process.exitCode());
    }
}

输出

$ ./test 
/bin/sleep: invalid time interval ‘a’
Try '/bin/sleep --help' for more information.
1
"SUCCESS : 0"

两者似乎Process::exitStatus()Process::exitCode()无法正常工作。

有谁知道为什么这些功能不起作用?我在滥用它们吗?

标签: c++qtqprocess

解决方案


输出是正确的。“sleep”从未崩溃,但它会验证输入,如果输入不充分,则打印一条错误消息,除此之外,它返回一个退出代码,指示程序是否正确使用,即返回一个 0或另一个数字,分别。

当程序不是为处理某些任务(例如访问未保留的内存)而设计时,就会发生崩溃。

因此,如果您想知道 sleep 是否按预期运行,则必须同时评估两种情况:

if(process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0)
{
    qCritical() << "SUCCESS";
}
else
{
    qCritical() << "ERROR";
}

推荐阅读