繁体   English   中英

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

[英]Read output of linux command without using temp file

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

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

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

像这样:

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

...

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

但是,我什么也没得到。 export添加到查询具有相同的结果。

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

那么如何解决呢? 还有没有更好的方法可以做到这一点?

任何想法表示赞赏:)

PS:我也想保留格式,应该保留\\t\\n ...

如果您使用的是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特定机制,通过管道读取child命令的stdout),然后(如果您绝对想让getenv以后工作​​),请使用putenv设置环境变量。

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

阅读Advanced Linux Programming ,以及有关fork(2)execve(2)的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM