在不使用临时文件的情况下读取linux命令的输出

Read output of linux command without using temp file

本文关键字:读取 linux 命令 输出 情况下 临时文件      更新时间:2023-10-16

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

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

我尝试将环境变量用作"临时文件",然后使用getenv将其放入变量中。

像这样:

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

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

然而,我一无所获。将export添加到查询中会得到相同的结果。

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

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

任何想法都值得赞赏:)

PS:我也想保留格式,它应该保留tn。。。

如果您正在使用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
}

它不能按您的意愿工作,因为systempopen将开始使用fork自己的shell进程,并且a变量不会导出,即使导出了,它也只能在该shell进程中使用,而不能在调用的原始进程中使用。

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

您可以执行所需操作的唯一方法是在fdisk -l上使用popen(或某些QProcess特定的机制,用于在管道上读取子命令的stdout),然后(如果您绝对希望稍后使用getenv)使用putenv来设置环境变量。

顺便说一句,fdisk可能正在使用/proc来获取其信息(您可以直接获取,请参阅proc(5)…)。

阅读高级Linux编程,以及关于fork(2)和execve(2)