/ / Read output polecenia linux bez użycia pliku tymczasowego - c ++, linux, qt

Odczytaj wyjście polecenia linux bez użycia pliku tymczasowego - c ++, linux, qt

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 № 1

Jeś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)