2014-08-27 197 views
0

我需要將某些linux命令的輸入讀取到QString變量。起初,我將流重定向到臨時文件並從中讀取。讀取linux命令的輸出而不使用臨時文件

但是,我不喜歡這種方式。我想避免訪問硬盤,越少越好。

我嘗試使用環境變量作爲「臨時文件」,然後使用getenv將其變爲一個變量。

這樣的:

QString query="a=$(fdisk -l)"; 
system(a.toStdString().c_str()); 

...

char* env; 
    env= getenv ("a"); 

不過,我什麼也沒得到。將export添加到查詢具有相同的結果。

我通過env命令手動檢查變量。沒有改變!

那麼如何解決這個問題呢?有沒有更好的方法來做到這一點?

任何想法表示讚賞:)

PS:我想保持的格式也一樣,它應該保持\t\n ...

+3

您可能想了解['popen'](http://man7.org/linux/man-pages/man3/popen.3.html)。 – 2014-08-27 16:16:51

+1

我建議你使用QProcess,而不是系統命令:http://qt-project.org/doc/qt-5/QProcess.html – TheDarkKnight 2014-08-27 16:17:00

+0

謝謝你的建議,我正在閱讀'popen'和'QProcess'。我不是一個懶惰的屁股,但它會很好,如果你們提供一些例子:) – Tiana987642 2014-08-27 16:25:16

回答

2

#include <QProcess> 

QString command = "/usr/bin/fdisk"; 
QStringList arguments; 
arguments << "-l"; 

QProcess process; 

process.start(command, arguments); 

process.waitForFinished(-1); 

QByteArray rawOutput = process.readAllStandardOutput(); 

QStringList output = QString(rawOutput).split("\n"); 
foreach (QString line, output) 
{ 
    // do something with each line from output 
} 
+0

你的解決方案工作:)但是,我的朋友建議我使用'QProcess :: write()'而不是'process.start(command,arguments);':它會用更多的參數來輸入一個長命令會更方便。謝謝:) – Tiana987642 2014-08-28 14:04:48

+0

@ Tiana987642:不客氣 – 2014-08-28 14:05:58

-1

,你想它不能正常工作,因爲systempopen將啓動使用fork自己的shell進程,並且a變量沒有被導出,即使它是,它也只能在該shell進程中使用,而不能在調用原始進程中使用。

請記住,子進程的更改通常不會影響其父進程(除了使用某些顯式IPC,例如兩者之間的管道)。

只有這樣,你可以做你想要的就是使用popen(或某些QProcess中的具體機制,就管道讀孩子命令的標準輸出)fdisk -l然後(如果你絕對想擁有你的getenv後工作)使用putenv來設置你的環境變量。

順便說一句,fdisk可能是使用/proc來獲取其信息(你可以直接得到,見proc(5) ...)。

如果您正在使用Qt的然後你應該使其在Qt的時尚,利用QProcess類閱讀Advanced Linux Programming,以及有關fork(2)execve(2)

+2

'然後使用putenv來設置你的環境變量。「我不認爲OP想要設置這個變量,他試圖使用變量進行通信。所以我會說這是完全不必要的,當你使用popen – Slava 2014-08-27 16:47:43