Трябва да прочетете въвеждане на някои команди на 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)