不使用临时文件读取linux命令的输出

时间:2014-08-27 16:13:50

标签: c++ linux qt

我需要读取一些Linux命令的输入到QString变量。首先,我将流重定向到临时文件并从中读取。

但是,我不喜欢这种方式。我想避免访问硬盘,越少越好。

我尝试将环境变量用作“临时文件”,然后使用getenv将其变为变量。

像这样:

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

...

  char* env;
  env= getenv ("a");
然而,我一无所获。向查询添加export具有相同的结果。

我通过env命令手动检查变量。什么都没改变!

那么如何解决这个问题呢?还有更好的方法吗?

赞赏任何想法:)

PS:我也希望保留格式,它应该保留\t\n ......

2 个答案:

答案 0 :(得分:2)

如果您使用的是 Qt ,那么您应该使用QProcess课程以 Qt的方式进行。

#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
}

答案 1 :(得分:-1)

它无法正常工作,因为systempopen将开始使用fork自己的shell进程,并且a变量不会导出,即使它是,它只在shell进程中可用,而不是在调用原始进程中。

请记住,子进程中的更改通常不会影响其父进程(除非使用一些显式IPC,例如两者之间的管道)。

你可以做到你想要的唯一方法是在popen上使用fdisk -l(或一些QProcess特定机制来读取子命令的stdout的管道)然后(如果你绝对想要让您的getenv稍后工作)使用putenv来设置您的环境变量。

BTW,fdisk可能正在使用/proc来获取其信息(您可以直接获取该信息,请参阅proc(5) ...)。

阅读Advanced Linux Programming,以及fork(2)execve(2)