Muszę odczytać dane wejściowe niektórych poleceń Linuksa do zmiennej QString. Najpierw przekierowuję strumień do pliku tymczasowego i czytam z niego.
Jednak nie podoba mi się ten sposób. Chcę uniknąć dostępu do dysku twardego, tym mniej tym lepiej.
Próbuję użyć zmiennej środowiskowej jako „pliku tymczasowego”, a następnie użyć getenv
aby dostać się do zmiennej.
lubię to:
QString query="a=$(fdisk -l)";
system(a.toStdString().c_str());
...
char* env;
env= getenv ("a");
jednak nic nie dostaję. Dodaj export
do zapytania ma taki sam wynik.
Ręcznie sprawdzam zmienne według env
dowództwo. Nic się nie zmieniło!
Więc jak to naprawić? I czy jest jakiś lepszy sposób na to?
Wszelkie pomysły są mile widziane :)
PS: Chcę też zachować format, powinien być zachowany t
, n
...
Odpowiedzi:
2 dla odpowiedzi № 1Jeśli używasz Qt wtedy powinieneś zrobić to w Moda Qt, wykorzystując QProcess
klasa.
#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 dla odpowiedzi № 2
Nie może działać tak, jak chcesz, ponieważ system
lub popen
zacznie używać fork
własny proces powłoki i a
zmienna nie jest eksportowana, a nawet gdyby była, będzie dostępna tylko w tym procesie powłoki, a nie w pierwotnym procesie wywołującym.
Pamiętaj, że zmiany w procesach potomnych nie mogą wpływać na ich proces nadrzędny w ogóle (z wyjątkiem używania jawnych IPC, takich jak potoki między nimi).
Jedyny sposób, w jaki możesz zrobić to, czego chcesz, to użyć popen
(lub jakiś specyficzny mechanizm QProcess do odczytu na potoku standardowego polecenia podrzędnego) na fdisk -l
wtedy (jeśli absolutnie chcesz mieć swój getenv
późniejsza praca) wykorzystanie putenv
ustawić zmienną środowiskową.
BTW, fdisk
prawdopodobnie używa /proc
aby uzyskać informacje (które można uzyskać bezpośrednio, zobacz proc (5) ...).
Czytać Zaawansowane programowanie Linux, i o widelec (2) i execve (2)