Merkwürdiges Verhalten von QProcess

Alles rund um die Programmierung mit Qt
Antworten
Katarn
Beiträge: 4
Registriert: 17. Juni 2010 16:11

Merkwürdiges Verhalten von QProcess

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
Katarn
Beiträge: 4
Registriert: 17. Juni 2010 16:11

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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

Code: Alles auswählen

time iwconfig
Katarn
Beiträge: 4
Registriert: 17. Juni 2010 16:11

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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:

Code: Alles auswählen

$ ifconfig 2>/dev/null
...
$ iwconfig 2>/dev/null
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();
}
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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:

Code: Alles auswählen

$ ifconfig 2>/dev/null
...
$ iwconfig 2>/dev/null
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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Haha nein, das wär zu dämlich. Aber lieber das als sonstige komische Hacks.
Katarn
Beiträge: 4
Registriert: 17. Juni 2010 16:11

Beitrag 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!
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Sehr schön :)
Antworten