2016-11-20 7 views
2

Я пытаюсь использовать инструмент Linux/Bluez: hcitool, чтобы выполнить сканирование BLE из QT.Не удается завершить работу QProcess с помощью hcitool на linux?

Я использую следующие, чтобы открыть процесс:

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); 

Тогда после этого я непрерывно читать из процесса, чтобы хранить все результаты:

QString result = hcitool->readLine(); 

Через пару секунд, я хочу остановите процесс hcitool, и в этом все пойдет не так. Я пробовал сигнал завершения, сигнал kill, записывая^C в процесс, но ничего не работает.

Фактически сигнал уничтожения завершает процесс. Но не в хорошем смысле, потому что после моего hci0 это задержать, и я не могу начать hcitool снова перед hci0 перезагрузки с:

hciconfig hci0 down 
hciconfig hci0 up 

Таким образом, любой идеи, как я могу прекратить этот процесс не так ли?

+0

Если Ctrl-C с консоли работает правильно, сделать то же самое, вам нужно отправить сигнал SIGINT, а не SIGKILL. –

+0

Да, это то, что, как я думал, произошло при отправке сигнала окончания в QT? .. Может быть, потому, что я запускаю hcitool «через» stdbuf? – Jolle

+2

'QProcess :: terminate' отправляет' SIGTERM', а не 'SIGINT'. Вы можете попробовать ':: kill (hcitool-> processId(), SIGINT)'. Проблема 'stdbuf' * может быть проблемой в зависимости от того, как она обрабатывает сигналы. –

ответ

1

(переход от комментария)

трюк, который, как правило, работают, чтобы просто close() поток, который должен дать SIGHUP или SIGPIPE к дочернему процессу, который часто обрабатывается более изящно.