/ / Прочетете продукцията на linux команда без да използвате temp файл - c ++, linux, qt

Прочетете продукцията на командата linux без да използвате temp файл - c ++, linux, qt

Трябва да прочетете въвеждане на някои команди на linux към QString променлива. Първоначално пренасочвам потока към временния файл и прочитам от него.

Обаче не харесвам този начин. Искам да избегна достъп до твърдия диск, толкова по-малко, толкова по-добре.

Опитвам се да използвам променливата на средата като "temp файл", след това използвам getenv за да се превърне в променлива.

като този:

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

...

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

обаче не получавам нищо. Добави export към заявката има същия резултат.

Ръчно проверявам променливите с env команда. Нищо не се промени!

И така, как да се определи това? И има ли по-добър начин да направите това?

Всички идеи са оценени :)

PS: Искам да запазя и формата, който трябва да запази t, n...

Отговори:

2 за отговор № 1

Ако използвате Qt тогава трябва да го направите в Qt мода, чрез използване QProcess клас.

#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 за отговор № 2

Тя не може да работи, както желаете, защото system или popen ще започне да се използва fork собствения си процес на обвивка и a променливата не се експортира и дори да е била, тя ще бъде достъпна само в този процес на обвивка, а не в извикващия оригинален процес.

Не забравяйте, че промените в детските процеси не могат да повлияят на родителския процес като цяло (освен чрез използването на ясни IPC като тръби между двете).

Единственият начин да направите това, което желаете, е да използвате popen (или някакъв механизъм, специфичен за QProcess, за да прочетете на тръбата ството на командата за дете) fdisk -l след това (ако абсолютно искате да имате своя getenv късно работа) putenv за да зададете променливата на средата.

BTW, fdisk вероятно използва /proc за да получите своята информация (която можете да получите директно, вижте Proc (5) ...).

Прочети Разширено програмиране на Linux, и около вилка (2) и execve (2)