2014-08-27 200 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