在 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
我解决了,问题是关于断点的。当我在没有调试模式的情况下运行程序时,它运行但现在我需要运行一个二进制文件。它可以像 ./您正在使用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 检测“网络不可达”?