在不使用临时文件的情况下读取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
}
它不能按您的意愿工作,因为system
或popen
将开始使用fork
自己的shell进程,并且a
变量不会导出,即使导出了,它也只能在该shell进程中使用,而不能在调用的原始进程中使用。
请记住,子进程中的更改通常不会影响其父进程(除非使用某些显式IPC,如两者之间的管道)。
您可以执行所需操作的唯一方法是在fdisk -l
上使用popen
(或某些QProcess特定的机制,用于在管道上读取子命令的stdout),然后(如果您绝对希望稍后使用getenv
)使用putenv
来设置环境变量。
顺便说一句,fdisk
可能正在使用/proc
来获取其信息(您可以直接获取,请参阅proc(5)…)。
阅读高级Linux编程,以及关于fork(2)和execve(2)
相关文章:
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- 奇怪的内存消耗 C fread / C++ 读取函数,基于 Linux sysinfo 数据
- 在 Linux 上从 UART 进行阻塞读取()
- Linux C++读取 UART 设备无法始终如一地工作
- 在 Linux 中禁用 USB 大容量存储设备的读取缓冲
- 如何使用QT在Linux中读取文件设备
- Linux 与 Windows,C++读取 CSV 文件的运行时性能差异
- Linux 在从文件中读取数据并放入矢量时比 Windows 快得多.txt.我将如何加速Windows以做同样的事情
- 使用 C++ 从 Linux 串行端口读取会提供混乱的数据
- usleep vs std::this_thread::sleep_for,当在 Linux 串行端口上写入/读取时
- Linux串行读取阻止minicom
- 从 shell 命令 Linux 读取值
- Arch Linux C 读取USB小鼠定位数据
- Linux套接字编程:读取Sigio的数据
- 多次从 std::cin 读取 -- Linux 和 Mac OS X 上的行为不同
- 以非阻塞方式读取Linux中的原始输入
- 在不使用临时文件的情况下读取linux命令的输出
- 使用fgetc读取Linux sysfs for gpio
- 使用 QT 读取 Linux/Ubuntu 上的电池状态
- 读取Linux inode位图