2016-11-20 3 views
2

Ich versuche, das Linux/Bluez-Tool zu verwenden: hcitool, um einen BLE-Scan von QT zu machen.Kann QProcess, das hcitool unter Linux ausführt, nicht beenden?

Ich verwende die folgenden, den Prozess zu öffnen:

QString program = "sudo stdbuf -oL hcitool -i hci0 lescan"; 
hcitool = new QProcess(); 

connect(hcitool, SIGNAL(started()), this, SLOT(hcitool_started())); 
connect(hcitool, SIGNAL(finished(int)), this, SLOT(hcitool_finished(int))); 
connect(this, SIGNAL(kill_hcitool()), hcitool, SLOT(kill())); 
connect(this, SIGNAL(terminate_hcitool()), hcitool, SLOT(terminate())); 

hcitool->start(program, QProcess::Unbuffered | QProcess::ReadWrite); 

Dann danach ich kontinuierlich aus dem Prozess lesen Sie alle Ergebnisse zu speichern:

QString result = hcitool->readLine(); 

Nach ein paar Sekunden, ich möchte Stoppen Sie den HCITool-Prozess, und hier laufen die Dinge schief. Ich habe versucht das Beendigungssignal, das Kill-Signal, zu schreiben^C an den Prozess, aber nichts geht.

Tatsächlich beendet das Abtötungssignal den Prozess. Aber nicht in einem guten Weg, weil danach meine hci0 halten ist, und ich kann nicht wieder starten hcitool bevor der hci0 mit zurückgesetzt wurde:

hciconfig hci0 down 
hciconfig hci0 up 

So irgendwelche Ideen, wie ich diesen Prozess richtig beenden kann?

+0

Wenn Ctrl-C von der Konsole funktioniert, müssen Sie das SIGINT-Signal senden, nicht SIGKILL. –

+0

Ja, das ist, was ich dachte, passiert beim Senden der Terminierung in QT? Kann es sein, weil ich hcitool "durch" stdbuf laufen? – Jolle

+2

'QProcess :: terminate' sendet 'SIGTERM' anstelle von' SIGINT'. Sie könnten versuchen, ':: kill (hcitool-> processId(), SIGINT)'. Das 'stdbuf' könnte ein Problem sein, je nachdem, wie es mit Signalen umgeht. –

Antwort

1

(aus dem Kommentar zu bewegen)

Ein Trick, der in der Regel arbeiten, ist nur close() der Strom, der ein SIGHUP oder SIGPIPE dem Kind Prozess geben sollte, die oft mehr anmutig gehandhabt wird.

Verwandte Themen