Merkwürdiges Verhalten von QProcess
Merkwürdiges Verhalten von QProcess
Guten Tag,
ich nutze das QProcess Objekt, um in einem Linux System die vorhandenen W-Lan Karten abzufragen. Dies will ich mit dem Befehl "iwconfig" machen, der in der Konsole auch ausgezeichnet funktioniert.
Verwende ich diesen Befehl mit QProcess, dann bekomme ich allerdings auch nach dem Warten auf Output keinen Output.
Verwende ich allerdings stattdessen den Befehl "ifconfig" zur Anzeige aller Netzwerkschnittstellen, bekomme ich mit dem gleichen SourceCode sofort die Erwartete Rückgabe des Befehls.
Die Programme "ifconfig" und "iwconfig" befinden sich im selben Verzeichnis (/sbin). AUch eine direkte Pfadangabe hat das Problem nicht beseitig.
Viele Grüße,
Katarn
ich nutze das QProcess Objekt, um in einem Linux System die vorhandenen W-Lan Karten abzufragen. Dies will ich mit dem Befehl "iwconfig" machen, der in der Konsole auch ausgezeichnet funktioniert.
Verwende ich diesen Befehl mit QProcess, dann bekomme ich allerdings auch nach dem Warten auf Output keinen Output.
Verwende ich allerdings stattdessen den Befehl "ifconfig" zur Anzeige aller Netzwerkschnittstellen, bekomme ich mit dem gleichen SourceCode sofort die Erwartete Rückgabe des Befehls.
Die Programme "ifconfig" und "iwconfig" befinden sich im selben Verzeichnis (/sbin). AUch eine direkte Pfadangabe hat das Problem nicht beseitig.
Viele Grüße,
Katarn
Ich gehe nicht über root, das ist auch normalerweise nicht nötig.
QProcessError = QProcess::UnknownError. Der Errorstring zeigt "Unknown Error".
Hier mein Code:
Edit:
Mir ist gerade aufgefallen, dass ab und zu
in der Console unten steht.
QProcessError = QProcess::UnknownError. Der Errorstring zeigt "Unknown Error".
Hier mein Code:
Code: Alles auswählen
void MainWindow::on_ListDevice_clicked()
{
QProcess* listwlan = new QProcess(this);
listwlan->start("/sbin/iwconfig");
// auf Nummer sicher gehen
listwlan->waitForReadyRead(500);
//Ausgabe raussschmeißen
Logwindow->SetLogWindowContents(QString(listwlan->readAll()));
//mit ifconfig fuktioniert hier alles prima
}Mir ist gerade aufgefallen, dass ab und zu
Code: Alles auswählen
&"warning: GDB: Failed to set controlling terminal: Invalid argument\n"Aha. Mach mal waitForFinished() ohne Parameter, ein waitForReadyRead() wartet nicht bis alles da ist. Wenn also 500ms nicht reichen, kommt der Output erst nachdem waitForReadyRead returniert hat.
Du kannst jetzt in ner Schleife auf den return von waitForReadyRead warten
Oder eben gleich waitForFinished();
Du kannst ja mal schauen, wie lange iwconfig auf der Console braucht
Du kannst jetzt in ner Schleife auf den return von waitForReadyRead warten
Code: Alles auswählen
while (proc->waitForReadyRead(500) {
// lesen und Verarbeiten
}Du kannst ja mal schauen, wie lange iwconfig auf der Console braucht
Code: Alles auswählen
time iwconfigtime iwconfig:
real 0m0.002s
user 0m0.000s
sys 0m0.010s
500 ms reichen da wohl, ich probiers trotzdem nochmal mit dem WaitforFinished()
Vielen Dank!
Edit:
Mit dem WaitforFinished hat es leider auch nicht geklappt (das Programm hängt sich aber nicht auf - WaitforFinished() rattert sehr schnell durch).
Ich geh jetzt mal diesem Mysteriösen Consolenfehler auf den Grund.
real 0m0.002s
user 0m0.000s
sys 0m0.010s
500 ms reichen da wohl, ich probiers trotzdem nochmal mit dem WaitforFinished()
Vielen Dank!
Edit:
Mit dem WaitforFinished hat es leider auch nicht geklappt (das Programm hängt sich aber nicht auf - WaitforFinished() rattert sehr schnell durch).
Ich geh jetzt mal diesem Mysteriösen Consolenfehler auf den Grund.
Da gibt's nichts merkwürdiges.. der folgende kurze Test zeigt, dass iwconfig die Ausgabe auf dem Stderr bringt, nicht auf dem Stdout:
Daher funktioniert bei mir folgender Code problemlos:
Code: Alles auswählen
$ ifconfig 2>/dev/null
...
$ iwconfig 2>/dev/null
Code: Alles auswählen
{
QProcess p;
p.setProcessChannelMode(QProcess::MergedChannels);
p.start("iwconfig");
p.waitForFinished();
qDebug() << p.readAll();
}Das war auch mein erster Gedanke. Bei mir bringen beide ihre Ausgabe auf stdout.solarix hat geschrieben:Da gibt's nichts merkwürdiges.. der folgende kurze Test zeigt, dass iwconfig die Ausgabe auf dem Stderr bringt, nicht auf dem Stdout:Code: Alles auswählen
$ ifconfig 2>/dev/null ... $ iwconfig 2>/dev/null
Hab hier als Distrie Mepis 8 oder so, unten drunter rennt aber ein Debian. Kenne mich leider nicht genauer aus, um jetzt dein Grund sagen zu koennen.
Nix "Ubuntu-schon-wieder".. Ich habe mir mal den Code angeschaut: das entscheidet das Tool je nach Fall: Weil ich auf meinem Testsystem gerade kein WLAN habe bringt es zwar eine Übersicht der vorhandenen Interfaces, jedoch alle mit "no wireless extensions" auf dem Stderr.
Könnte es sein, dass Katarn auf dem Testsystem ebenfalls keine WLAN-Interfaces hat und kater schon?
Könnte es sein, dass Katarn auf dem Testsystem ebenfalls keine WLAN-Interfaces hat und kater schon?
Guten Tag,
ich habe hier tatsächlich keine WLAN Interfaces, ich schreibe das Programm stellvertretend für den Laptop der hinter mir steht.
Danke, dass das jetzt geklärt ist, ich werde mich jetzt mal bemühen das Programm mit euren Anregungen richtig zu stellen.
Viele Grüße
Edit: und schon klappt alles, vielen Dank!
ich habe hier tatsächlich keine WLAN Interfaces, ich schreibe das Programm stellvertretend für den Laptop der hinter mir steht.
Danke, dass das jetzt geklärt ist, ich werde mich jetzt mal bemühen das Programm mit euren Anregungen richtig zu stellen.
Viele Grüße
Edit: und schon klappt alles, vielen Dank!