QProcess.start 不返回退出状态或退出代码

Posted

技术标签:

【中文标题】QProcess.start 不返回退出状态或退出代码【英文标题】:QProcess.start doesn't return exit status nor exit code 【发布时间】:2021-08-16 18:14:02 【问题描述】:

我目前正在使用 QProcess 从 C++ 应用程序运行 Linux 命令,但在使用 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"

我发现使用Process::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() 似乎都无法正常工作。

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

【问题讨论】:

【参考方案1】:

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

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

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

if(process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0)

    qCritical() << "SUCCESS";

else

    qCritical() << "ERROR";

【讨论】:

以上是关于QProcess.start 不返回退出状态或退出代码的主要内容,如果未能解决你的问题,请参考以下文章

如果代码不为0,则无法获取erlang escript退出代码

程序退出状态和 $?

设置退出状态代码的最佳实践

在处理状态超时时优雅地退出 gen_statem

来自 apache 的子进程返回退出代码 -6 而不是 stdout 或 stderr

退出时如何保存 Activity 的状态?安卓