在 Android 平台上通过 QProcess 运行 shell 命令

Posted

技术标签:

【中文标题】在 Android 平台上通过 QProcess 运行 shell 命令【英文标题】:Run a shell command via QProcess on Android Platform 【发布时间】:2017-01-19 07:18:43 【问题描述】:

我无法在 android 平台上通过 QProcess 运行任何命令。我正在使用 Qt 库。谁能解释如何在 Android 平台上从我的应用程序运行 shell 命令?

    QProcess process();

    process.execute("ls");

   bool finished = process.waitForFinished(-1);

   qDebug() <<  "End : " << finished << " Output : " << process.errorString();

如果我不指定超时,该过程不会完成。当我指定超时时,process.waitForFinished() 返回 false,比如说 10000 毫秒。

【问题讨论】:

有人可以帮忙吗? 你能解释什么是错的吗?比如进程完成后QProcess::error()errorString()exitCode()exitStatus()等的值是多少。 它没有完成,只是等待 【参考方案1】:

您的示例代码有问题,无法在任何平台上运行! ls 命令不准确!此命令内置于 shell 程序中,例如 bash

您代码中的另一个错误是QProcess::execute 是static function。 所以最后一行对您尝试启动的流程没有影响。

所以你的代码应该是这样的:

QProcess process;
process.start("bash", QStringList() << "-c" << "ls");

bool finished = process.waitForFinished(-1);

【讨论】:

我用 process.start("bash", QStringList() 问题是:Android有bash吗?使用adb 进行检查。如果它有它:你有能力运行它(如果需要的话)?现在你应该看看日志,看看打印了什么样的错误信息。 ls不是内置函数,请参阅 bash 文档:gnu.org/software/bash/manual/html_node/Bash-Builtins.html 我解决了,问题是关于断点的。当我在没有调试模式的情况下运行程序时,它运行但现在我需要运行一个二进制文件。它可以像 ./ 这样从 adb shell 运行,但我不知道如何使用 QProcess 运行【参考方案2】:

您正在使用QProcess::execute(),这是一个静态函数。引用Qt documentation:“在新进程中启动程序命令,等待它完成”。

那么您的代码中可能发生的情况是:

QProcess process();

process.execute("ls"); // Start "ls" and wait for it to finish
// "ls" has finished
bool finished = process.waitForFinished(-1); // Wait for the process to finish, but there is no process and you could get locked here forever...

有两种方法可以修复您的代码:

QProcess process();

process.start("ls"); // Start "ls" and returns

bool finished = process.waitForFinished(-1);

qDebug() <<  "End : " << finished << " Output : " << process.errorString();

 QProcess::execute("ls");

【讨论】:

不幸的是,结果是一样的。它没有结束,只是等待 我做了一些测试。 Qt 似乎没有锁定等待不存在的进程,我给你的示例在桌面和 Android 上运行良好。问题可能只是“ls”没有停止。我在 Debian 上看到过这样的情况,其中一个进程正在访问文件系统并阻止其他进程访问它,其他进程就会被卡住。

以上是关于在 Android 平台上通过 QProcess 运行 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章