在 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 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上通过 QProcess 启动提升的子进程?

QProcess 无法通过 QPushButton 执行终端行命令

如何使用 QProcess 通过 Ping 检测“网络不可达”?

如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

QProcess与外部程序的调用(可以通过设置管道来交互)

QProcess 无法启动进程:未找到进程