2016-11-20 72 views
2

我正在嘗試使用Linux/Bluez工具:hcitool,從QT進行BLE掃描。無法終止在Linux上運行hCitool的QProcess?

我使用以下方法來打開進程:

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進程,這是事情出錯的地方。我試過終止信號,終止信號,把^ C寫入進程,但沒有任何效果。

其實kill信號完成該過程。但不是在事後,因爲我hci0是抱了起來,我不能再次啓動hcitool前hci0已經與重置一個好辦法:

hciconfig hci0 down 
hciconfig hci0 up 

所以任何想法如何我可以終止這個過程嗎?

+0

如果控制檯的Ctrl-C正常工作,要做同樣的事,你必須發送SIGINT信號,而不是SIGKILL。 –

+0

是的,那是我在QT中發送終止信號時發生了什麼?..是否因爲我通過「stdbuf」運行hcitool? – Jolle

+2

'另外,QProcess :: terminate'發送'SIGTERM'而不是'SIGINT'。你可以試試':: kill(hcitool-> processId(),SIGINT)'。 'stdbuf' *可能會成爲一個問題,這取決於它如何處理信號。 –

回答

1

(從註釋移動)

,通常工作是剛剛close()流,應該給一個SIGHUP或SIGPIPE子進程,這往往是處理得比較優雅的惡作劇。