2017-01-19 85 views
7

我無法在Android平臺上通過QProcess運行任何命令。我正在使用Qt庫。任何人都可以解釋如何從Android平臺上的應用程序運行shell命令?在Android平臺上通過QProcess運行shell命令

QProcess process(); 

    process.execute("ls"); 

    bool finished = process.waitForFinished(-1); 

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

如果我沒有指定超時,則進程沒有完成。當我指定超時時,process.waitForFinished()返回false假設10000毫秒。

+0

任何人都可以幫助嗎? – ArnesTwin

+0

你能解釋什麼是錯的嗎?像過程完成後,'QProcess :: error()','errorString()','exitCode()','exitStatus()'等等的值是什麼。 –

+0

它沒有完成,只是等待 – ArnesTwin

回答

5

你的示例代碼出現故障,它不會在任何平臺上運行! ls命令不是一個確切的!該命令被構建到一個shell程序中,例如bash

您代碼中的另一個錯誤是QProcess::executestatic function。 因此最後一行對您嘗試啓動的進程沒有影響。

所以,你的代碼應該是這樣的:

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

bool finished = process.waitForFinished(-1); 
+0

我試着用process.start(「bash」,QStringList()<<「-c」<<「ls」);但它並沒有結束。它在ubuntu上運行沒有問題,但它不能運行在android – ArnesTwin

+0

問題是:Android是否有'bash'?用'adb'檢查。如果它具有它:你有能力運行它(如果需要的話)?現在您應該查看日誌並查看打印的錯誤信息類型。 –

+0

'ls'sis不是內置函數,請參閱bash文檔:https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html –

0

您正在使用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... 

有2種方法來解決你的代碼:

QProcess process(); 

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

bool finished = process.waitForFinished(-1); 

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

QProcess::execute("ls"); 
+0

不幸的是,結果是一樣的。它並沒有結束,只是等待 – ArnesTwin

+0

我已經做了一些測試。 Qt似乎沒有鎖定等待一個不存在的過程,我給你的例子在桌面和Android上都能正常工作。問題可能只是「ls」不會停止。我曾在Debian上看到過一個進程正在訪問文件系統並阻止其他進程訪問它的情況,其他進程會被卡住。 –