Seite 1 von 1
Merkwürdiges Verhalten von QProcess
Verfasst: 17. Juni 2010 18:03
von Katarn
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
Verfasst: 17. Juni 2010 18:13
von franzf
Gibt es einen Error? (QProcess::ProcessError)
Was sagt process.errorString()?
Ansonsten -> Code.
Sachen in /sbin brauchen normalerweise root-Rechte. /sbin ist auch per Default nicht im PATH eines normalen Users. Startest du dein Programm dann auch schon als root? Gehst du evtl. über sudo?
Verfasst: 17. Juni 2010 22:46
von Katarn
Ich gehe nicht über root, das ist auch normalerweise nicht nötig.
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
}
Edit:
Mir ist gerade aufgefallen, dass ab und zu
Code: Alles auswählen
&"warning: GDB: Failed to set controlling terminal: Invalid argument\n"
in der Console unten steht.
Verfasst: 17. Juni 2010 22:56
von franzf
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
Code: Alles auswählen
while (proc->waitForReadyRead(500) {
// lesen und Verarbeiten
}
Oder eben gleich waitForFinished();
Du kannst ja mal schauen, wie lange iwconfig auf der Console braucht
Verfasst: 17. Juni 2010 23:03
von Katarn
time 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.
Verfasst: 18. Juni 2010 16:39
von solarix
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
{
QProcess p;
p.setProcessChannelMode(QProcess::MergedChannels);
p.start("iwconfig");
p.waitForFinished();
qDebug() << p.readAll();
}
Verfasst: 18. Juni 2010 16:59
von kater
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:
Das war auch mein erster Gedanke. Bei mir bringen beide ihre Ausgabe auf stdout.
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.
Verfasst: 18. Juni 2010 17:24
von solarix
kater hat geschrieben:[...] Bei mir bringen beide ihre Ausgabe auf stdout. [...]
Echt? Spannend.. bei mir (Ubuntu) ist es definitiv Stderr.. aber macht ja nichts.. mit "QProcess::MergedChannels" klappts dann auf beiden Systemen..
Verfasst: 18. Juni 2010 17:43
von kater
Ubuntu schon wieder... wir packen eine nicht-Fehlermeldung auf die Error Ausgabe. Haben die das in iwconfig umgeschrieben? Glaub ich nicht. Das wäre ohne Worte.
Aber mir ist auch nicht bekannt, dass man irgendwo einstellen kann, dass die Ausgabe umgeleitet wird.
Verfasst: 18. Juni 2010 18:29
von solarix
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?
Verfasst: 18. Juni 2010 18:33
von kater
Haha nein, das wär zu dämlich. Aber lieber das als sonstige komische Hacks.
Verfasst: 19. Juni 2010 10:10
von Katarn
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!
Verfasst: 19. Juni 2010 11:07
von kater
Sehr schön
